禁用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
退出了。有什么办法可以避免这个错误,同时又不需要在POST中使用CSRF令牌呢?
谢谢!
2 个回答
9
我知道你已经得到了答案,确实Ned说得对;不过除了这个,还有一点:不仅Django希望视图能返回一个响应,你的客户端也是这么期待的!如果不返回任何东西,这会导致HTTP错误,并且可能浪费资源(这样就不能及时关闭连接)!
在这种情况下,我觉得使用204 No Content或者304 Not Modified这两个HTTP状态码是合适的;在Django中:
return HttpResponse(status=204)
或者
from django.http import HttpResponseNotModified
return HttpResponseNotModified()
7
Django其实是希望视图函数能返回一些响应的。你可以试着返回一个空的响应,而不是返回None吗?或者返回一个HTTP错误代码呢?