• Django 如何让ajax的POST方法带上CSRF令牌


    问题

    大家知道,在大前端领域,有一种叫做ajax的东东,即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),它被用来在不刷新页面的情况下,提交和请求数据。当没有<form>元素时,也就是如果Django服务器接收的是一个通过ajax发送过来的POST请求的话,那么将很麻烦,何也?因为只要有<form>元素就可以直接携带{% csrf_token %}令牌,但是,在没有<form>元素情况下,ajax没办法像<form>元素那样携带{% csrf_token %}令牌。那怎么办呢?好办!

    方法一(用在js文件中)

    在你的前端模版的JavaScript代码处,添加下面的代码:

    /****************** BEGIN ******************/
    // 官方提供的js文件ajax携带CSRF令牌的方法(使用jQuery库),参考官网https://docs.djangoproject.com/zh-hans/2.0/ref/csrf/

    //***** 第一步:获取CSRF令牌 *****// function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie !== '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = jQuery.trim(cookies[i]); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) === (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } var csrftoken = getCookie('csrftoken');
    //***** 第二步:在ajax请求上设置CSRF令牌 *****//
    function csrfSafeMethod(method) { // 这些HTTP方法不要求携带CSRF令牌。test()是js正则表达式方法,若模板匹配成功,则返回true return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } $.ajaxSetup({ beforeSend: function(xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader("X-CSRFToken", csrftoken); } } }); /****************** END ******************/

    上面代码的作用就是让你的ajax的POST方法带上CSRF需要的令牌,它依赖jQuery库,必须提前加载jQuery。这也是Django官方提供的解决方案,请参考。

    方法二(用在HTML文件中)

    简单快捷的解决办法,示例如下。

    $.ajax({
        type: "POST",       // POST方法
        url: "{% url 'oper:course_add_comment' %}",     // 处理请求的url
        data: {'course_id': {{ course_id }}, 'comment': comment},
        async: true,
        cache: false,
        beforeSend: function (xhr, settings) {
            xhr.setRequestHeader("X-CSRFToken", "{{ csrf_token }}");    // 重点是这里! 注意{{ csrf_token }}必须加上引号!
        },
        success: function (data) {          // 请求成功后,视图传回的数据
            if (data.status == 'fail') {
                if (data.msg == '用户未登录') {
                    alert("您还未登录,不能评论!点击右上角登录按钮进行登录。");
                } else {
                    alert(data.msg)
                }
    
            } else if (data.status == 'success') {
                alert(data.msg);
                location.reload();         // 刷新当前页面
            }
        },
    });

      至此,转载请注明出处。

    本站相关链接:>>Django部署 ]

  • 相关阅读:
    C艹老师布置的思考题
    计蒜客练习题:网页跳转(java / C++仔细)
    计蒜客练习题:水果店(嵌套map)
    计蒜客练习题:蒜头君面试(map + max_element)
    小希的迷宫 HDU 1272(并查集)
    OpenJ_Bailian 1061
    Aizu 2224(并查集)
    Aizu 0189 (最短路)
    POJ 2377(最大生成树)
    OpenJ_Bailian 4118(dp)
  • 原文地址:https://www.cnblogs.com/wcwnina/p/9099561.html
Copyright © 2020-2023  润新知