程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了未设置 Django CSRF cookie:使用 Ajax 跨站点 views.py:main.js:settings.pyPOST 请求:到目前为止我尝试过的:大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决未设置 Django CSRF cookie:使用 Ajax 跨站点 views.py:main.js:settings.pyPOST 请求:到目前为止我尝试过的:?

开发过程中遇到未设置 Django CSRF cookie:使用 Ajax 跨站点 views.py:main.js:settings.pyPOST 请求:到目前为止我尝试过的:的问题如何解决?下面主要结合日常开发的经验,给出你关于未设置 Django CSRF cookie:使用 Ajax 跨站点 views.py:main.js:settings.pyPOST 请求:到目前为止我尝试过的:的解决方法建议,希望对你解决未设置 Django CSRF cookie:使用 Ajax 跨站点 views.py:main.js:settings.pyPOST 请求:到目前为止我尝试过的:有所启发或帮助;

我的代码有两部分,首先是通过简单的 localhost:3000python http server 上运行的前端(无框架/库)和在 Django server 上运行的 localhost:8080 /API/csrf/,这里发生的事情是前端正在向 Django 服务器发出跨站点 POST 请求,但它被禁止(未设置 CSRF cookie。) > 错误。我知道这个问题已经被问过很多次了,但我似乎没有找到解决方案。

我没有像这样在 Django 中请求 POST 调用的任何经验,不是使用 DRF,而是使用我们自己的端点

问题代码:

首先前端应向def get_csrf(request): # print(get_token(request)) return JsonResponse({ 'detail': 'CSRF cookie set','X-CSrftoken': get_token(request) })

发出一个csrf令牌的get请求

vIEws.py:

success: function (response,status,xhr) {
      $('.csrftoken').attr('value',response['X-CSrftoken']);
       setcookie("csrftoken",response['X-CSrftoken']);
}

得到值后,token被分配给cookie和一个隐藏元素通过

main.Js:

xhr.getResponseheader("X-CSrftoken") -> response['X-CSrftoken']

上面的代码工作正常,我们得到了值,一开始,它是这样的,但不起作用,所以我把它改成了:

header:{ 'X-CSrftoken': token}

现在,每当 前端 向后端发出 POST 调用并在 localhost:8080 上运行 ForbIDden (CSRF cookie not set.) 403 时,它都会得到 INSTALLED_APPS = [ 'corsheaders,] MIDDLEWARE = [ 'corsheaders.mIDdleware.CorsMIDdleware',] CSRF_cookie_httpONLY = True SESSION_cookie_httpONLY = True CORS_ALLOWED_ORIGINS = [ "http://localhost:3000","http://127.0.0.1:3000" ]

settings.py

$.AJAX({
      type: "POST",headers:{
        'Content-Type': 'application/Json','Accept': 'application/Json','X-Requested-With': 'XMLhttpRequest','X-CSrftoken': csrftoken,},url: "/API/userdetails/",data: JsON.stringify(somedata),...
      ...
})

POST 请求

# from the hIDden element
const csrftoken = document.querySelector('.csrftoken').value;
# from the cookie
const csrftoken = getCcookie('csrftoken');
# from the name
const csrftoken = jquery("[name=csrfmIDdlewaretoken]").val();

到目前为止我尝试过的:

我尝试通过-

获取csrftoken
CSRF_cookie_httpONLY = True
SESSION_cookie_httpONLY = True

所有这些都成功检索到值,我可以在请求头标头中看到该值,但 django 仍然说没有 csrftoken 正如文档所说,在设置一个必须从隐藏元素中获取值时使用以下代码时,我再次尝试在没有它的情况下使用它:

function csrfSafeMethod(method) {
  // these http methods do not require CSRF protection
  return (/^(GET|head|OPTIONS|TRACE)$/.test(method));
}
$.AJAXSetup({
        beforeSend: function(xhr,settings) {
            if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                xhr.setRequestheader("X-CSrftoken",csrftoken);
            }
        }

Doc 说也试试这个:

{{1}}

但是这里没有成功的尝试,代码有什么问题?以及我该如何度过难关。

解决方法

您必须在 django html 模板中包含 {% csrf_token %}。这将创建名为“csrfmiddlewaretoken”的隐藏输入 html 标记。

必须在呈现 html 代码后包含设置 var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val(); 的 javascript 代码,否则 var csrftoken 将设置为 null。

<!DOCTYPE html>
<html>
<body>

<form method="post" action="{% url 'django-view-ajax-handle' %}" id="ajax-function-id" name="ajax-function-name">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit">
</form>

// GET CSRF_TOKEN AFTER HTML
var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();

<script>
function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

$(document).ready(function () {
  $("#ajax-function-id").submit(function (event) {

    $.ajax({
      type: "POST",url: $('[name="ajax-function-name"]').attr("action"),beforeSend: function(xhr,settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken",csrftoken);
        }
      },success: function (data) {
        // handle_success
      }
    });
    return false;
  });
});
</script>
</body>
</html>

大佬总结

以上是大佬教程为你收集整理的未设置 Django CSRF cookie:使用 Ajax 跨站点 views.py:main.js:settings.pyPOST 请求:到目前为止我尝试过的:全部内容,希望文章能够帮你解决未设置 Django CSRF cookie:使用 Ajax 跨站点 views.py:main.js:settings.pyPOST 请求:到目前为止我尝试过的:所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: