Декоратор require_safe
Декоратор require_safe применяется к функциям представлений
и ограничивает доступ к ним только безопасными HTTP-методами -
GET, HEAD и OPTIONS. Этот декоратор является частью модуля
django.views.decorators.http. Если клиент отправляет
запрос с методом, не входящим в список безопасных, представление
вернет ответ с кодом статуса 405 (Method Not Allowed).
Декоратор не принимает дополнительных аргументов.
Синтаксис
from django.views.decorators.http import require_safe
@require_safe
def my_view(request):
# Обработка безопасного запроса
pass
Пример . С использованием GET-запроса
Давайте создадим представление, которое будет доступно только через безопасные методы, и обработаем GET-запрос:
from django.http import HttpResponse
from django.views.decorators.http import require_safe
@require_safe
def article_list(request):
articles = [
{"id": 1, "title": "First article"},
{"id": 2, "title": "Second article"},
]
return HttpResponse(f"Articles: {articles}")
Пример . С обработкой HEAD-запроса
Декоратор также разрешает HEAD-запросы, которые не возвращают тело ответа, но содержат те же заголовки, что и GET-запрос:
from django.http import HttpResponse
from django.views.decorators.http import require_safe
@require_safe
def article_detail(request, article_id):
article = {"id": article_id, "title": f"Article {article_id}"}
response = HttpResponse(f"Article: {article}")
response["X-Article-ID"] = str(article_id)
return response
Результат выполнения HEAD-запроса:
"Response body is empty, but headers exist: X-Article-ID=5"
Пример . С POST-запросом (запрещен)
Попробуем отправить POST-запрос к представлению,
защищенному декоратором require_safe:
from django.http import HttpResponse
from django.views.decorators.http import require_safe
from django.core.exceptions import PermissionDenied
@require_safe
def create_article(request):
# Этот код не выполнится при POST-запросе
if request.method == "POST":
return HttpResponse("Article created")
return HttpResponse("Send POST request to create article")
При попытке отправить POST-запрос к этому представлению будет возвращен ответ с кодом 405:
"Method Not Allowed (POST)"
Смотрите также
-
декоратор
require_GET,
который разрешает только GET-запросы -
декоратор
require_POST,
который разрешает только POST-запросы -
декоратор
require_http_methods,
который разрешает указанные HTTP-методы -
декоратор
csrf_exempt,
который отключает CSRF-защиту для представления