My Django приложение использует стек промежуточного программного обеспечения, содержащего CsrfViewMiddleware и собственное промежуточное программное обеспечение:Джанго терпит неудачу в сочетании с ответом генерируемой промежуточного
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.middleware.transaction.TransactionMiddleware',
'myapp.OwnMiddleware'
)
Основная идея в том, что если URL не может быть найден, т.е. функция просмотра не найдена, эта ошибка улавливается OwnMiddleware.process_response()
, которая возвращает собственный ответ, если статус HTTP равен 404 (и выполняются некоторые другие условия).
Это работает нормально, с одной проблемой: поскольку функция просмотра не вызывается, когда указан недопустимый URL (в соответствии с URLconf), CsrfViewMiddleware.process_view()
никогда не вызывается, и, таким образом, C cookF не создается.
Поэтому вся система CSRF не работает, а токен CSRF по-прежнему установлен на «NOTPROVIDED» в OwnMiddleware.process_response
(это означает, что {% csrf_token%} генерирует пустую строку вместо обычного скрытого поля формы).
Каков наилучший способ решить эту проблему, т.е. иметь OwnMiddleware catch 404s и возвращать другой (не 404) ответ, хотя он все еще может использовать токен CSRF в этих ответах?
Заранее спасибо.
Всего один комментарий, я просто попытался использовать handler404, и он отлично работает для DEBUG = False, однако он отключен, когда DEBUG = True (тогда вызывается только обработчик по умолчанию 404). Поэтому это не имеет никакого реального смысла, если вы хотите добавить функциональность для 404s, которые должны быть протестированы. – ChrisM