【问题标题】:Why do I get 'CSRF Token Missing or Incorrect' error for Javascript Request为什么我会收到 Javascript 请求的“CSRF 令牌丢失或不正确”错误
【发布时间】:2019-11-03 13:47:24
【问题描述】:

我试图在单击按钮时在 Javascript 中创建请求,但收到错误 Forbidden (CSRF token missing or incorrect.)。 我在 HTML 模板中包含了{% csrf_token %}

<form action="/cart" method="POST">
    {% csrf_token %}
    <button type="button" id="ordered">Place Order</button>
</form>

但我不确定是否必须将其包含在我的 Javascript 请求中:

const request = new XMLHttpRequest();
request.open("POST", "/cart");

// send request
let data = new FormData();

items = localStorage.getItem(user + "items")
total = localStorage.getItem(user + "price")
data.append("items", items)
data.append("total", total)

request.send(data);

在我的views.py

def cart(request):
    if request.method == "POST":
        data = request.get_json()
        print(f"{data}")

        return HttpResponseRedirect(reverse("index"))
   else:
        return render(request, "cart.html")

【问题讨论】:

  • 我不明白您的表单和 JS 代码是如何以任何方式链接的。为什么网站某处表单中的令牌会自动将 csrf 令牌添加到 JS 请求中?
  • 我是 Django 新手,请教我如何操作
  • 将您的本地存储属性放在隐藏字段中,并在您的视图中以 request.POST['items'] 的形式获取该值,您不需要进行任何 XMLHttpRequest()。如果您使用表单,请通过给定的链接:docs.djangoproject.com/en/2.2/topics/forms

标签: javascript python django ajax csrf


【解决方案1】:

您必须在每个 JavaScript 请求中发送 CSRF 令牌:https://docs.djangoproject.com/en/2.2/ref/csrf/#ajax

【讨论】:

    【解决方案2】:

    要消除此错误,只需将 CSRF 令牌附加到您的 json 数据或将其添加到标题中,如下所示。

    ...
    headers: {'X-CSRFToken': '{{ csrf_token }}'}
    ...
    

    ...
    headers: [{name: 'X-CSRFToken', value: csrfToken.value}],
    ...
    

    【讨论】:

    • 不会 {{ csrf_token }} 包括整个表单字段
    猜你喜欢
    • 2017-09-01
    • 2019-06-20
    • 1970-01-01
    • 2018-03-15
    • 2020-09-19
    • 2014-09-10
    • 2021-07-14
    • 2019-07-31
    • 2017-09-10
    相关资源
    最近更新 更多