Декоратор require_POST
Декоратор require_POST применяется к функциям представления
и проверяет, что входящий запрос выполнен методом POST.
Если запрос выполнен методом GET, PUT, DELETE или любым другим,
то представление не вызывается, а возвращается ответ с кодом
405 Method Not Allowed. Декоратор находится в модуле
django.views.decorators.http. Этот декоратор часто
используется для защиты представлений, которые обрабатывают
передачу форм, загрузку файлов или выполняют изменение данных
в базе данных.
Синтаксис
from django.views.decorators.http import require_POST
@require_POST
def my_view(request):
# Обработка POST-запроса
pass
Пример . С обработкой формы
Рассмотрим пример представления для создания статьи, которое принимает только POST-запросы:
from django.shortcuts import render, redirect
from django.views.decorators.http import require_POST
from myapp.models import Article
@require_POST
def create_article(request):
title = request.POST.get('title')
content = request.POST.get('content')
Article.objects.create(title=title, content=content)
return redirect('article_list')
Если пользователь попытается открыть URL этой функции через GET-запрос (например, просто перейдет по ссылке), то получит ошибку 405:
"Method Not Allowed (GET): /articles/create/"
Пример . С обработкой загрузки файлов
Декоратор require_POST также полезен для представлений,
которые обрабатывают загрузку файлов через форму:
from django.views.decorators.http import require_POST
from django.http import JsonResponse
from myapp.models import Document
@require_POST
def upload_file(request):
uploaded_file = request.FILES.get('file')
if uploaded_file:
document = Document.objects.create(
name=uploaded_file.name,
file=uploaded_file
)
return JsonResponse({
'status': 'success',
'id': document.id
})
return JsonResponse({'status': 'error'}, status=400)
Пример . С валидацией данных
В этом примере представление обрабатывает POST-запрос с данными для обновления профиля пользователя:
from django.views.decorators.http import require_POST
from django.shortcuts import get_object_or_404
from django.http import HttpResponse
from myapp.models import UserProfile
@require_POST
def update_profile(request, user_id):
profile = get_object_or_404(UserProfile, user_id=user_id)
email = request.POST.get('email')
phone = request.POST.get('phone')
if email:
profile.email = email
if phone:
profile.phone = phone
profile.save()
return HttpResponse('Profile updated successfully')
Смотрите также
-
декоратор
require_GET,
который ограничивает доступ только для GET-запросов -
декоратор
require_http_methods,
который позволяет указать список разрешенных HTTP методов -
декоратор
require_safe,
который ограничивает доступ для безопасных методов (GET и HEAD) -
декоратор
csrf_exempt,
который отключает проверку CSRF-токена для представления