Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django cookie中没有csrftoken_Django_Ajax_Csrf Token - Fatal编程技术网

django cookie中没有csrftoken

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

我正在测试发出一个POST ajax请求,由于没有csrftoken,我得到了一个403。但是,我遵循了文档,它仍然不起作用,我发现名为csrftoken的cookie是空的,它的意思是
$.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?你考虑在文档上拉一个请求来包含这个吗?