Django CSRF 令牌存在但仍然出现 403 Forbidden 错误
Django CSRF Token present but still getting 403 Forbidden Error
我正在尝试设置一个 Django API 来接收 POST 带有一些 JSON 数据的请求,并基本上将电子邮件发送到收件人列表。逻辑很简单:
首先我有创建博客时的视图post。在模板中,我包含了 Django 文档中指定的 csrf_token。当我点击提交按钮时,create-post 视图在后台除了创建 post 之外,还向收费的 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 添加到 headers 中,这是我通过 get_token() 方法生成的。但是,API 中的响应是 403 禁止状态 CSRF 令牌未设置。
我已经检查了请求中的 headers 并且令牌确实存在。此外,我一直在提供通往 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 令牌的有用性。
有谁知道可能导致此问题的原因是什么?
谢谢
错误试图告诉您需要像这样将令牌添加到 cookie 存储中:
cookies = {'csrftoken': csrf_token}
requests.post(var["BASE_URL"] + "_api/send-notification/", json=data, headers=headers, cookies=cookies)
我正在尝试设置一个 Django API 来接收 POST 带有一些 JSON 数据的请求,并基本上将电子邮件发送到收件人列表。逻辑很简单:
首先我有创建博客时的视图post。在模板中,我包含了 Django 文档中指定的 csrf_token。当我点击提交按钮时,create-post 视图在后台除了创建 post 之外,还向收费的 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 添加到 headers 中,这是我通过 get_token() 方法生成的。但是,API 中的响应是 403 禁止状态 CSRF 令牌未设置。
我已经检查了请求中的 headers 并且令牌确实存在。此外,我一直在提供通往 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 令牌的有用性。
有谁知道可能导致此问题的原因是什么? 谢谢
错误试图告诉您需要像这样将令牌添加到 cookie 存储中:
cookies = {'csrftoken': csrf_token}
requests.post(var["BASE_URL"] + "_api/send-notification/", json=data, headers=headers, cookies=cookies)