【问题标题】:Django CSRF Token present but still getting 403 Forbidden Error存在 Django CSRF 令牌但仍然出现 403 禁止错误
【发布时间】:2021-07-08 15:56:30
【问题描述】:

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

  • 首先,我有创建博客文章的视图。在模板中,我包含了 Django 文档中指定的 csrf_token。当我点击提交按钮时,在幕后,创建帖子视图除了创建帖子外,还会向负责发送电子邮件的 API 发出请求(我正在使用请求模块)。这是向 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)
    

如您所见,根据 Django 文档,我将 X-CSRFToken 添加到通过 get_token() 方法生成的标头中。但是,API 中的响应是 403 Forbidden status CSRF Token not set

我检查了请求中的标头,并且令牌确实存在。此外,我一直在为 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_exempt 装饰器,在我看来这并不是一个真正的解决方案。它只是完全摆脱了 CRSF 令牌的用处。

有没有人知道可能是什么导致了这个问题? 谢谢

【问题讨论】:

    标签: django api python-requests csrf django-middleware


    【解决方案1】:

    错误试图告诉您需要像这样将令牌添加到 cookie 存储中:

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

    【讨论】:

    猜你喜欢
    • 2016-05-08
    • 2013-05-12
    • 2013-05-25
    • 2015-10-15
    • 2015-07-30
    • 1970-01-01
    • 2021-11-04
    • 2013-07-19
    • 2018-11-06
    相关资源
    最近更新 更多