Как настроить обработку Django CSRF для каждого представления - PullRequest
1 голос
/ 16 марта 2020

В приложении 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 таким образом, чтобы он не зависел от этой детали реализации?

...