Отключение Django CSRF для представлений, которые не всегда имеют ответ - PullRequest
15 голосов
/ 17 июля 2010

У меня есть представление Django, которое получает сообщения POST, которым не нужен токен CSRF. Поэтому я использовал декоратор @csrf_exempt на виде. Проблема в том, что иногда я не выдаю ответ от представления (это бот Twitter, он получает HTTP POST для каждого твита, и я не хочу отвечать на каждый твит). Когда я не выдаю ответ, я получаю следующую ошибку:

Traceback (most recent call last):

 File "/home/adam/webapps/newman/lib/python2.5/django/core/handlers/base.py", line 100, in get_response
   response = callback(request, *callback_args, **callback_kwargs)

 File "/home/adam/webapps/newman/lib/python2.5/django/views/decorators/csrf.py", line 24, in wrapped_view
   resp.csrf_exempt = True

AttributeError: 'NoneType' object has no attribute 'csrf_exempt'

resp (который я предполагаю, является ответом) - None, потому что представление было закрыто только с return. Как я могу избежать этой ошибки и до сих пор не требовать токенов CSRF в POST.

Спасибо!

Ответы [ 2 ]

9 голосов
/ 13 декабря 2010

Я знаю, что вы уже получили свой ответ, и действительно, Нед прав; но в дополнение к этому: не только Django действительно ожидает представления, чтобы вернуть ответ, но и ваш клиент! Это ошибка HTTP и, скорее всего, трата ресурсов - не вернуть что-либо (и, таким образом, немедленно закрыть соединение)!

Я бы подумал, что 204 Нет содержимого или 304 Не изменено (см .: Коды состояния HTTP ) - подходящие http-коды для использования в этой ситуации; в Джанго :

return HttpResponse(status=204)

или

from django.http import HttpResponseNotModified
return HttpResponseNotModified()
7 голосов
/ 17 июля 2010

Django действительно ожидает, что функции представления возвращают ответы. Может быть, вы могли бы вернуть пустой ответ вместо None? Или вернуть код ошибки HTTP?

...