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

Благодарность!

15
Adam 17 Июл 2010 в 04:12

2 ответа

Лучший ответ

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

7
Ned Batchelder 17 Июл 2010 в 00:17

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

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

return HttpResponse(status=204)

Или

from django.http import HttpResponseNotModified
return HttpResponseNotModified()
9
Stefano 13 Дек 2010 в 13:39