代码之家  ›  专栏  ›  技术社区  ›  Adam

为不总是有响应的视图禁用Django CSRF

  •  15
  • Adam  · 技术社区  · 14 年前

    我有一个Django视图,接收不需要CSRF令牌的帖子。所以我用了 @csrf_exempt 在视图上装饰。问题是,有时我不会从视图中发出响应(这是一个twitter机器人,它会为每个tweet接收一个http帖子,我不想对每个tweet都做出响应)。当我不发出响应时,会收到以下错误:

    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 回复  |  直到 14 年前
        1
  •  7
  •   Ned Batchelder    14 年前

    Django确实希望视图函数返回响应。也许你可以返回一个空的响应而不是一个都不返回?或者返回HTTP错误代码?

        2
  •  9
  •   Stefano    14 年前

    我知道你已经得到了答案,内德说得对。 但除此之外:不仅Django真的期望视图返回一个响应,您的客户也!这是一个HTTP错误,如果不返回某些内容(从而直接关闭连接),可能会浪费资源!

    我认为A 204无内容或304未修改(见: HTTP Status Codes )在这种情况下是否使用合适的HTTP代码;在 django :

    return HttpResponse(status=204)
    

    from django.http import HttpResponseNotModified
    return HttpResponseNotModified()