Разрешить только определенные HTTP запросы при помощи require_http_methods в Django

Категория: Разработка
Теги: Веб-разработка
Опубликовано: 3 января 2021 г. 5:22
Просмотров: 2647

Разрешить только определенные HTTP запросы при помощи require_http_methods в Django

В Django существует довольно простой способ разрешить только определенные типы HTTP запросов при помощи декоратора представлений require_http_methods.

Для этого необходимо во всех классах и функциях контроллера (views.py) импортировать библиотеку from django.views.decorators.http import require_http_methods и добавить декоратор @require_http_methods(["GET", "POST"]). В скобках передаются названия тех HTTP запросов, которые необходимо разрешить. 

Для сведения: многие веб-сервера автоматически преобразуют HEAD запросы в GET.

POST запрос предполагает отправку данных на сайт, и если таковая не требуется, рекомендуется его отключить. Поэтому в нашем примере POST запросы будут отключены.

Пример кода с использованием функций в views.py:

from django.views.decorators.http import require_http_methods

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

Декоратор @require_http_methods(["GET", "HEAD"]) добавляется перед функцией. 

Однако некоторые используют классы-контроллеры, и как в таком случае добавить декоратор? Внутри функции в классе или перед объявлением класса? В любом из этих вариантов работать не будет.

В случае использования классов во views.py require_http_methods используется следующим образом:

from django.views.decorators.http import require_http_methods

class my_class(ListView):
    require_http_methods = ['GET', 'HEAD']
    
    def func(self):
        pass