В приложении Django у меня включена 'django.middleware.csrf.CsrfViewMiddleware'
. Это означает, что запрос POST
без токена CSRF будет отклонен и приведет к ответу HTTP Запрещено (код состояния 403).
Теперь у меня есть одно представление, которое должно обрабатывать отсутствующий токен CSRF в другом путь. Вместо ответа 403. Я хочу перенаправить пользователя на другую страницу.
Я предложил следующее решение (на основе документов: https://docs.djangoproject.com/en/3.0/ref/csrf/#scenarios):
@csrf_exempt # Disable CSRF middleware
@requires_csrf_token # Apply customized CSRF middleware
def my_view(request):
if getattr(request, 'csrf_processing_done', False):
# CSRF success, process request
...
else:
# CSRF failed, redirect
return HttpResponseRedirect(...)
Это красиво и коротко, и, кажется, отлично работает. Однако моя проблема заключается в том, что он опирается на детали реализации.
Текущая версия Django только когда-либо устанавливает csrf_processing_done
в True
в методе _accept
CsrfViewMiddleware
(https://github.com/django/django/blob/3.0.4/django/middleware/csrf.py#L141)
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * CsrfViewMiddleware
* * * * * * * * * * * * * * '' *1025* '' _reject
* * то же самое).
Так что моя текущая реализация будет работать до тех пор, пока Django не изменит реализацию этого промежуточного программного обеспечения и декоратора.
Поскольку csrf_processing_done
не является частью publi c API (я спросил: https://code.djangoproject.com/ticket/31360), у меня остался вопрос; Есть ли способ настроить обработку сбоя CSRF таким образом, чтобы он не зависел от этой детали реализации?