django cookie中没有csrftoken
我正在测试发出一个POST ajax请求,由于没有csrftoken,我得到了一个403。但是,我遵循了文档,它仍然不起作用,我发现名为csrftoken的cookie是空的,它的意思是django cookie中没有csrftoken,django,ajax,csrf-token,Django,Ajax,Csrf Token,我正在测试发出一个POST ajax请求,由于没有csrftoken,我得到了一个403。但是,我遵循了文档,它仍然不起作用,我发现名为csrftoken的cookie是空的,它的意思是$.cookie(“csrftoken”)返回null 有人能告诉我原因以及如何将csrftoken设置为cookie吗?我认为您应该提供代码,说明如何在HTML/JS代码中获取csrf令牌,以及如何为您的中间件进行设置 首先,您应该检查django.middleware.csrf.CsrfViewMiddlew
$.cookie(“csrftoken”)
返回null
有人能告诉我原因以及如何将
csrftoken
设置为cookie吗?我认为您应该提供代码,说明如何在HTML/JS代码中获取csrf令牌,以及如何为您的中间件进行设置
首先,您应该检查django.middleware.csrf.CsrfViewMiddleware
是否已打开
在python代码中,我使用request.META.get('CSRF\u COOKIE')
获取令牌时,我也遇到了类似的问题
在模板-{%csrf\u token%}
Django中使用此令牌时,Django注意到该令牌已呈现,并在CsrfViewMiddleware.process\u response
中设置Cookie。如果您以其他方式获取令牌值,Django将丢失此标志。因此,它将生成一个令牌,但不会设置相应的cookie
我在代码中有两种变通方法。您应该将其添加到视图中,这些视图用于使用JS代码生成模板
1。您可以强制Django设置CSRF Cookie:
# Force updating CSRF cookie
request.META["CSRF_COOKIE_USED"] = True
2.Django设置在您调用get\u令牌时自动使用的CSRF\u COOKIE
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
您可能希望使用视图装饰器(从Django 1.4开始提供)。这将设置csrftoken
cookie,即使您不使用{{csrf\u token}}
模板标记。我也遇到同样的问题($.cookie('csrftoken')返回“未定义”)
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)
问题出在我的Django配置中,我对以下行进行了注释,它可以正常工作:
#CSRF_COOKIE_HTTPONLY = True # Prevent client-side JavaScript access to the CSRF cookie
扩展:通过注释CSRF_COOKIE_HTTPONLY
行,CSRF_令牌值不再是“未定义的”(在Firefox firebug中),而是显示为“真实”值,例如“qGuPe2Q7…”。。。等等
Ajax请求不再被拒绝,并出现403禁止
错误,并且被正确执行(前提是在Ajax头中设置了csrf_令牌)
首先,如果要设计应用程序,最好在头或POST请求中使用csrf令牌,而不是在cookie中,因为:
- 所有表单都必须动态地将值添加到其HTML中。任何AJAX
帖子还必须包含该值
- cookie将针对每个请求提交(即,所有请求的获取)
CSRF过程中未涉及的图像、CSS、JS等)
增加请求大小
如果您想强制在django中使用cookies,您可以始终:
request.META["CSRF_COOKIE_USED"] = True
如果您没有在任何地方使用{%csrf_token%},则在项目中。根据[documentation][1],您不需要做任何其他事情,只需要编写一个简单的javascript代码。事实并非如此。您必须在每个视图中放置“request.META['CSRF\u COOKIE\u USED']=True”
行(或编写适当的装饰程序)。以前也有类似问题,与CSRF\u protect装饰程序有关。如果您是从一个页面发布到另一个url(例如ajax)如果您使用@csrf_protect decorator等,请确保您发布数据的视图和接收发布数据的url都有此decorator。您的视图、模板表单?是的,HTTP只有cookie不能在浏览器中用JavaScript访问。@ OYC,你在哪里评论它?如何在前端获得<代码> CSRFoTeNe/CODE?你考虑在文档上拉一个请求来包含这个吗?