Ответ 1
Django действительно ожидает, что функции просмотра возвращают ответы. Может быть, вы можете вернуть пустой ответ вместо None? Или верните код ошибки HTTP?
У меня есть представление 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.
Спасибо!
Django действительно ожидает, что функции просмотра возвращают ответы. Может быть, вы можете вернуть пустой ответ вместо None? Или верните код ошибки HTTP?
Я знаю, что ты уже получил свой ответ, и действительно Нед прав; но в дополнение к этому: не только Django действительно ожидает, что мнения возвратят ответ, ваш клиент тоже! Это ошибка HTTP и, вероятно, ресурс, который не должен что-то возвращать (и, таким образом, немедленно закрыть соединение)!
Я думаю, что 204 No Content или 304 Not modified (см.: HTTP Status Codes) являются подходящими http-кодами для использования в этом ситуация; в django:
return HttpResponse(status=204)
или
from django.http import HttpResponseNotModified
return HttpResponseNotModified()