django没有csrftoken在cookie中

时间:2012-11-16 08:07:18

标签: ajax django

我正在测试发布POST ajax请求

因为没有csrftoken

我得到了403

我跟着文件,它仍然不起作用。

我发现名为csrftoken的cookie是为空

表示 $ .cookie(“csrftoken”)返回null

有人可以告诉我原因!!

如何将csrftoken设置为cookie

THX !!

5 个答案:

答案 0 :(得分:19)

我认为您应该提供代码,以获取HTML / JS代码中的csrf令牌以及中间件的设置。

首先,您应该检查django.middleware.csrf.CsrfViewMiddleware是否已开启。

我有类似的问题,在python代码中我使用request.META.get('CSRF_COOKIE')来获取令牌。

在模板中使用此令牌时 - {% csrf_token %} Django注意到令牌已呈现并在CsrfViewMiddleware.process_response中设置Cookie。如果你以其他方式获得令牌值,Django将错过这个标志。因此它会生成一个令牌,但不会设置相应的cookie。

我在代码中有2个变通方法。您应该将它添加到用于使用JS代码生成模板的视图中。

1. 您可以强制Django设置CSRF Coo​​kie:

# Force updating CSRF cookie
request.META["CSRF_COOKIE_USED"] = True

2. 如果您拨打get_token

,Django会自动设置CSRF_COOKIE_USED
from django.middleware.csrf import get_token
# don't use direct access to request.META.get('CSRF_COOKIE')
# in this case django will NOT send a CSRF cookie. Use get_token function
csrf_token = get_token(request)

这些解决方案中的每一个都应该单独工作。我建议使用get_token

答案 1 :(得分:14)

您可能想要使用ensure_csrf_cookie视图装饰器(自Django 1.4起可用)。即使您不使用csrftoken模板标记,也会设置{{ csrf_token }} Cookie。

答案 2 :(得分:4)

我遇到了同样的问题($ .cookie(' csrftoken')返回' undefined')。

问题出在我的Django配置中,我评论了以下行并且它有效:

#CSRF_COOKIE_HTTPONLY = True  # Prevent client-side JavaScript access to the CSRF cookie

答案 3 :(得分:2)

扩展o_c's answer:通过评论class DataPacket{ [JSONProperty(PropertyName="1234")] public DummyObject OneTwoThreeFour {get;set;}//or whatever you want to name. } 行,csrf_token值不再是“未定义”(在Firefox firebug中),并显示为“真实”值,例如'qGuPe2Q7 ......等等。'

Ajax请求不再被CSRF_COOKIE_HTTPONLY错误拒绝并且被正确执行(前提是在AJAX标头中设置了csrf_token)。

403 Forbidden

答案 4 :(得分:1)

首先,如果您正在设计应用程序,最好在标头或POST请求中而不是在cookie中使用csrf Token,因为:

  • 所有表单必须动态地将值添加到其HTML中。任何AJAX POST还必须包含值。
  • 每次请求都会提交cookie(即所有请求的GET) CSRF过程中没有涉及的图像,CSS,JS等) 增加请求大小。

如果你想在django中强制使用cookies,你总是可以:

request.META["CSRF_COOKIE_USED"] = True
如果您未在任何地方使用{%csrf_token%},请在项目中

。根据[文档] [1],您不需要做任何其他事情,而是编写一个简单的JavaScript代码。实际上这不是真的。你必须在每个视图中放置"request.META['CSRF_COOKIE_USED'] = True"行(或编写适当的装饰器)。