【问题标题】:With @csrf_exempt still have Set-Cookie: csrftoken使用 @csrf_exempt 仍然有 Set-Cookie: csrftoken
【发布时间】:2015-08-29 06:45:00
【问题描述】:

使用 Django 1.8,当用户未登录时,我不想在我的网站主页上设置 cookie。所以我用@csrf_exempt 来装饰我的视图

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt 
def mainhome(request):

当我查看查询时,我可以看到 cookie 仍然设置,为什么?

rodo@roz-desktop:~/(master)$ curl  -I http://127.0.0.1:8000/
HTTP/1.0 200 OK
Date: Sat, 13 Jun 2015 08:59:27 GMT
Server: WSGIServer/0.1 Python/2.7.8
Content-Type: text/html; charset=utf-8
Vary: Cookie
X-QueryInspect-Duplicate-SQL-Queries: 2
X-QueryInspect-Total-SQL-Time: 34 ms
X-QueryInspect-Total-Request-Time: 283 ms
X-QueryInspect-Num-SQL-Queries: 3
Set-Cookie:  csrftoken=sa5x0DyxgBamca0D84ZZnzl2WAL0evkv; expires=Sat, 11-Jun-2016 08:59:27 GMT; Max-Age=31449600; Path=/

【问题讨论】:

    标签: django cookies


    【解决方案1】:

    csrf_exempt 控制是否在 POST 上强制执行 CSRF。与是否设置 CSRF cookie 无关;这是由 CsrfViewMiddleware 为所有响应完成的。

    【讨论】:

      【解决方案2】:

      正如@Daniel Roseman 所指出的,@csrf_exempt 不会帮助您。

      负责会话 cookie 的中间件是 SessionMiddleware。您可以在Django Docs: How to use sessions 中阅读更多相关信息。不幸的是,没有类似的装饰器可以免除某些特定的视图。

      因此,为了自定义中间件的行为,您需要从 SessionMiddleware 继承。在 SO 上有一个nice answer 讨论此事。

      【讨论】:

      • 感谢您的回答,它完全符合我的要求,很好的答案真的很好,可惜我自己没有找到它。
      猜你喜欢
      • 1970-01-01
      • 2012-11-04
      • 2018-01-04
      • 2015-05-21
      • 2016-04-18
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      相关资源
      最近更新 更多