Разрешить только определенные 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