【问题标题】:Disabling Django CSRF for views that do not always have a response为不总是有响应的视图禁用 Django CSRF
【发布时间】:2011-03-17 05:24:15
【问题描述】:

我有一个 Django 视图,它接收不需要 CSRF 令牌的 POST。因此我在视图上使用了@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 令牌。

谢谢!

【问题讨论】:

    标签: python django csrf decorator django-csrf


    【解决方案1】:

    我知道你已经得到了答案,而且内德确实是对的; 但除此之外:不仅 Django 真的希望视图返回响应,您的客户端也如此!这是一个 HTTP 错误,并且可能会浪费资源而不返回某些内容(因此立即关闭连接)!

    我认为 204 No Content 或 304 Not modified(请参阅:HTTP Status Codes)是在这种情况下使用的适当 http 代码;在django

    return HttpResponse(status=204)
    

    from django.http import HttpResponseNotModified
    return HttpResponseNotModified()
    

    【讨论】:

      【解决方案2】:

      Django 确实希望视图函数返回响应。也许您可以返回一个空响应而不是 None?还是返回 HTTP 错误码?

      【讨论】:

        猜你喜欢
        • 2013-08-24
        • 2022-08-18
        • 2018-08-12
        • 1970-01-01
        • 2017-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多