Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.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 CSRF令牌存在,但仍收到403禁止错误_Django_Api_Python Requests_Csrf_Django Middleware - Fatal编程技术网

Django CSRF令牌存在,但仍收到403禁止错误

Django CSRF令牌存在,但仍收到403禁止错误,django,api,python-requests,csrf,django-middleware,Django,Api,Python Requests,Csrf,Django Middleware,我正在尝试设置一个DjangoAPI,它接收带有一些JSON数据的POST请求,并基本上向收件人列表发送电子邮件。逻辑相当简单: 首先,当我创建一篇博客文章时,我有了它的视图。在模板中,我包括Django文档中指定的csrf_令牌。当我点击submit按钮时,除了创建帖子之外,CreatePost视图还在场景后面向负责发送电子邮件的API发出请求(我正在使用requests模块)。这是向API发送请求的逻辑部分: data = { "title": ne

我正在尝试设置一个DjangoAPI,它接收带有一些JSON数据的POST请求,并基本上向收件人列表发送电子邮件。逻辑相当简单:

  • 首先,当我创建一篇博客文章时,我有了它的视图。在模板中,我包括Django文档中指定的csrf_令牌。当我点击submit按钮时,除了创建帖子之外,CreatePost视图还在场景后面向负责发送电子邮件的API发出请求(我正在使用requests模块)。这是向API发送请求的逻辑部分:

    data = {
              "title": new_post.title,
              "summary": new_post.summary,
              "link": var["BASE_URL"] + f"blog/post/{new_post.slug}"
          }
    
    csrf_token = get_token(request)
    # print(csrf_token)
    headers = {"X-CSRFToken": csrf_token}
    
    requests.post(var["BASE_URL"] + "_api/send-notification/", json=data, headers=headers)
    
如您所见,我正在将X-CSRFToken添加到通过get_token()方法生成的头中,如Django文档所示。但是,API中的响应是403禁止状态未设置CSRF令牌

我已经检查了请求中的头,并且令牌确实存在。此外,我还提供了到API的其他路径,并将其用于AJAX调用,这同样非常简单,只需遵循Django文档,它们就可以很好地工作

当我在视图中进行调用时,问题似乎出现了,AJAX调用由Javascript静态文件处理,正如我所说,它们工作得很好

我认为Django不允许在同一页面上使用2个CSRF令牌(一个用于提交表单,另一个用于get_token()视图),但这不是问题所在。 这通常是我得到的错误:

>>> Forbidden (CSRF cookie not set.): /_api/send-notification/
>>> "POST /_api/send-notification/ HTTP/1.1" 403 2864
我在SO上读过几个类似的问题,但它们主要涉及使用csrf_豁免装饰器,在我看来这并不是一个真正的解决方案。它只是完全消除了CRSF标记的有用性

有人知道是什么导致了这个问题吗?
谢谢。

错误试图告诉您需要将令牌添加到cookie存储中,如下所示:

cookies = {'csrftoken': csrf_token}
requests.post(var["BASE_URL"] + "_api/send-notification/", json=data, headers=headers, cookies=cookies)

工作很有魅力,谢谢!你知道为什么Django希望令牌出现在cookie中,而不是出现在专用的头文件中吗?阅读这个问题-