Декоратор csrf_protect
Декоратор csrf_protect применяется к функциям представления
и принудительно включает проверку CSRF-токена для POST-запросов.
Этот декоратор полезен, когда CSRF-защита отключена глобально
для всего проекта или для конкретного представления требуется
явная проверка токена. Декоратор принимает функцию представления
и возвращает обертку, которая выполняет проверку токена перед
обработкой запроса.
Синтаксис
from django.views.decorators.csrf import csrf_protect
@csrf_protect
def my_view(request):
# view logic
pass
Пример
Давайте создадим представление для обработки формы, которое
использует декоратор csrf_protect для защиты от CSRF-атак:
from django.shortcuts import render
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_protect
from django.template import RequestContext
@csrf_protect
def create_article(request):
if request.method == 'POST':
# Process the form data
title = request.POST.get('title')
content = request.POST.get('content')
if title and content:
return HttpResponse("Article created successfully!")
else:
return HttpResponse("Please fill all fields")
return render(request, 'article_form.html')
В этом примере декоратор csrf_protect гарантирует,
что все POST-запросы к представлению create_article
будут содержать корректный CSRF-токен. Если токен отсутствует
или недействителен, Django вернет ошибку 403 Forbidden.
Пример
Рассмотрим пример с использованием декоратора csrf_protect
вместе с другими декораторами:
from django.shortcuts import render
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_protect
from django.views.decorators.http import require_POST
from django.contrib.auth.decorators import login_required
@login_required
@require_POST
@csrf_protect
def update_profile(request):
# Update user profile
user = request.user
email = request.POST.get('email')
bio = request.POST.get('bio')
if email:
user.email = email
user.save()
if bio:
# Update profile bio
user.profile.bio = bio
user.profile.save()
return HttpResponse("Profile updated successfully")
В этом примере декоратор csrf_protect используется
вместе с login_required и require_POST.
Порядок декораторов важен: csrf_protect должен быть
самым внутренним декоратором, чтобы проверка CSRF выполнялась
после проверки метода запроса.
Пример
Рассмотрим использование декоратора csrf_protect
с представлением, использующим классы:
from django.views import View
from django.shortcuts import render
from django.http import JsonResponse
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_protect
@method_decorator(csrf_protect, name='dispatch')
class ArticleCreateView(View):
def get(self, request):
return render(request, 'article_create.html')
def post(self, request):
# Process the article creation
data = {
'title': request.POST.get('title'),
'content': request.POST.get('content'),
'author': request.user.username
}
# Save article logic
return JsonResponse({
'status': 'success',
'message': 'Article created',
'data': data
})
Для классовых представлений декоратор csrf_protect
применяется с помощью method_decorator к методу
dispatch, чтобы защитить все HTTP-методы.
Смотрите также
-
декоратор
csrf_exempt,
который отключает CSRF-проверку для представления -
декоратор
ensure_csrf_cookie,
который гарантирует установку CSRF-токена в куки -
декоратор
require_POST,
который требует метод POST для запроса -
декоратор
require_http_methods,
который ограничивает разрешенные HTTP-методы