禁用Django CSRF对没有响应的视图

15 投票
2 回答
6689 浏览
提问于 2025-04-16 01:25

我有一个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错误代码呢?

撰写回答