Декоратор require_GET
Декоратор require_GET применяется к функциям представления
и проверяет, что входящий запрос имеет метод GET. Если запрос
поступает с другим методом (например, POST, PUT, DELETE),
декоратор возвращает ответ с кодом состояния 405 (Method Not Allowed).
Это полезно для представлений, которые должны обрабатывать только
получение данных, а не их модификацию. Декоратор расположен
в модуле django.views.decorators.http.
Синтаксис
from django.views.decorators.http import require_GET
from django.http import HttpResponse
@require_GET
def view_name(request):
# код обработки GET-запроса
return HttpResponse("Ответ")
Пример
Давайте создадим представление, которое возвращает список статей, но только при GET-запросе:
from django.views.decorators.http import require_GET
from django.http import JsonResponse
from myapp.models import Article
@require_GET
def article_list(request):
articles = Article.objects.all().values('id', 'title')
return JsonResponse(list(articles), safe=False)
Если к этому представлению обратиться через GET-запрос, оно вернет список статей в формате JSON. Если же попытаться отправить POST-запрос, Django вернет ошибку 405:
"Method Not Allowed (POST): /articles/"
Пример
Рассмотрим случай, когда представление обрабатывает поиск по статьям через GET-параметры:
from django.views.decorators.http import require_GET
from django.shortcuts import render
from myapp.models import Article
@require_GET
def search_articles(request):
query = request.GET.get('q', '')
if query:
articles = Article.objects.filter(title__icontains=query)
else:
articles = Article.objects.none()
return render(request, 'search.html', {'articles': articles, 'query': query})
Теперь если пользователь перейдет по URL
/search/?q=django, представление обработает поиск
и вернет результаты. Если же на этот URL отправить
POST-запрос, будет возвращена ошибка 405:
"Method Not Allowed (POST): /search/"
Пример
Декоратор require_GET можно комбинировать с другими
декораторами, например, с csrf_exempt для представлений,
которые должны принимать GET-запросы без CSRF-защиты:
from django.views.decorators.http import require_GET
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
@csrf_exempt
@require_GET
def public_api(request):
return HttpResponse("Public API data")
В этом случае представление будет доступно только для
GET-запросов, но при этом CSRF-защита будет отключена.
Обратите внимание на порядок декораторов: сначала
csrf_exempt, затем require_GET.
Смотрите также
-
декоратор
require_POST,
который ограничивает доступ только POST-запросами -
декоратор
require_http_methods,
который ограничивает доступ указанными HTTP-методами -
декоратор
require_safe,
который ограничивает доступ только безопасными методами (GET, HEAD) -
декоратор
csrf_exempt,
который отключает CSRF-защиту для представления