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

У меня есть представление 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.

Спасибо!

Ответы

Ответ 1

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

Ответ 2

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

Я думаю, что 204 No Content или 304 Not modified (см.: HTTP Status Codes) являются подходящими http-кодами для использования в этом ситуация; в django:

return HttpResponse(status=204)

или

from django.http import HttpResponseNotModified
return HttpResponseNotModified()