我正在测试发布POST ajax请求
因为没有csrftoken
我得到了403我跟着文件,它仍然不起作用。
我发现名为csrftoken的cookie是为空
表示 $ .cookie(“csrftoken”)返回null
有人可以告诉我原因!!
如何将csrftoken设置为cookie
THX !!
答案 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 Cookie:
# Force updating CSRF cookie
request.META["CSRF_COOKIE_USED"] = True
2. 如果您拨打get_token
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,因为:
如果你想在django中强制使用cookies,你总是可以:
request.META["CSRF_COOKIE_USED"] = True
如果您未在任何地方使用{%csrf_token%},请在项目中。根据[文档] [1],您不需要做任何其他事情,而是编写一个简单的JavaScript代码。实际上这不是真的。你必须在每个视图中放置"request.META['CSRF_COOKIE_USED'] = True"
行(或编写适当的装饰器)。