2012-03-19 2 views
1

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 в этих ответах?

Заранее спасибо.

ответ

2

Вы можете вручную запустить что-то вроде:

CsrfViewMiddleware.process_view(request, lambda: your_response, [], {}) 

P.S. Я думаю, что лучше использовать handler404, чтобы поймать 404's

+1

Всего один комментарий, я просто попытался использовать handler404, и он отлично работает для DEBUG = False, однако он отключен, когда DEBUG = True (тогда вызывается только обработчик по умолчанию 404). Поэтому это не имеет никакого реального смысла, если вы хотите добавить функциональность для 404s, которые должны быть протестированы. – ChrisM

Смежные вопросы