天天看點

Django(23)Django限制請求裝飾器

前言

有時候,我們想要限制通路的請求方法,比如我們希望使用者隻能通過

get

方式請求,

post

不允許,那麼我們可以采用裝飾器的方式,django已經為我們提供了内置的裝飾器

限制請求裝飾器

Django内置的視圖裝飾器可以給視圖提供一些限制。比如這個視圖隻能通過

GET

method

通路等。

django.http.decorators.http.require_http_methods

裝飾器方法的路徑,接下來我們看下它的源碼

def require_http_methods(request_method_list):
    """
    Decorator to make a view only accept particular request methods.  Usage::

        @require_http_methods(["GET", "POST"])
        def my_view(request):
            # I can assume now that only GET or POST requests make it this far
            # ...

    Note that request methods should be in uppercase.
    """
    def decorator(func):
        @wraps(func)
        def inner(request, *args, **kwargs):
            if request.method not in request_method_list:
                response = HttpResponseNotAllowed(request_method_list)
                log_response(
                    'Method Not Allowed (%s): %s', request.method, request.path,
                    response=response,
                    request=request,
                )
                return response
            return func(request, *args, **kwargs)
        return inner
    return decorator
           

上述裝飾器的含義是如果請求方法不在

request_method_list

這個清單中,那麼就傳回

HttpResponseNotAllowed

405方法不允許

在源碼中django又定義了3個屬性

require_GET = require_http_methods(["GET"])
require_GET.__doc__ = "Decorator to require that a view only accepts the GET method."

require_POST = require_http_methods(["POST"])
require_POST.__doc__ = "Decorator to require that a view only accepts the POST method."

require_safe = require_http_methods(["GET", "HEAD"])
require_safe.__doc__ = "Decorator to require that a view only accepts safe methods: GET and HEAD."
           

上述代碼django又幫助我們定義好了隻允許

GET

方法,隻允許

POST

GET和HEAD

方法,了解完源碼後,我們就可以開始實操了

實戰案例

我們建立一個視圖,導入裝飾器,定義一個

index

函數,在函數上加上一個

require_GET

裝飾器,代碼如下

from django.views.decorators.http import require_http_methods, require_GET, require_POST
from django.http import HttpResponse


@require_POST  
def index(request):
    return HttpResponse('success')
           

接下來我們通路這個視圖,可以從PyCharm的控制台清楚的看到,傳回的是405

Method Not Allowed (GET): /
[21/May/2021 02:08:05] "GET / HTTP/1.1" 405 0
           

接下來我們使用

require_http_methods

方法來給大家示範,代碼如下

require_http_methods(['GET'])
def index1(request):
    return HttpResponse('success')
           

接下來我們通過網頁通路,可以看到是可以正常通路的

[21/May/2021 02:20:59] "GET / HTTP/1.1" 200 7