【发布时间】: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