繁体   English   中英

如何为 ajax Django 中的 POST 请求手动传递 CSRF 令牌

[英]How to pass CSRF token manually for POST requests in ajax Django

We have a Django app which works as an iframe and it works fine in Safari and Chrome Browsers but in Safari it is blocking all the cookies and sessions that causes all the post request to be forbidden due to no CSRF Cookie. 那么有什么方法可以使用 AJAX 帖子传递这个 CSRF cookie 以及标题。

您可以尝试将以下内容添加到您的 ajax 帖子中

data['csrfmiddlewaretoken'] = jQuery("[name=csrfmiddlewaretoken]").val()

其中data是您要发送到服务器的数据。 为此,您需要在您的网站上的某处放置{% csrf_token %} ,否则 jQuery 无法找到令牌值。

您可以从视图传递 csrf 令牌。 您可以通过以下两种方式之一来获取它(这些我已经亲自测试过,我确信它们有效):

  1. csrf_token = self.request.COOKIES.get('csrftoken')
  2. 第二种选择往往更可靠。 我不记得它到底是什么特殊的边缘情况,但它曾经在这里提出的第一个解决方案失败了。
# import
from django.middleware.csrf import get_token

# in the view
csrf_token = get_token(request)

获取令牌后,您必须以任何您想要的方式将其传递给模板。 假设您只是将它添加到上下文变量中,如下所示:

context['csrf_token'] = csrf_token

太好了,现在在模板中,您必须将其与每个请求一起发送。 根据我的经验,您只需要对POST请求执行此操作。 发送它的方法是将它包含在标题中:

let response = await fetch('/my/api/url', {
    method: 'POST',
    body: JSON.stringify({
        'field1: 'value1',
        ...
    }),
    headers: {
        'X-CSRFToken': "{{ csrf_token }}",
        'Content-type': 'application/json'
    }
}).then(...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM