博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过ajax方式向Django Post数据的方法
阅读量:7217 次
发布时间:2019-06-29

本文共 1701 字,大约阅读时间需要 5 分钟。

Django默认提供了很好的跨域攻击保护(csrf)机制,采用常规的方法,我们几乎感觉不到这个机制的存在(好吧,还是需要在form中添加{% csrf_token %})。但是当我们期望能够以Ajax的方式向服务器提交表单的时候,问题就来了。

常规的HTTP GET方法被认为是安全的,不会做csrf检查,而POST、PUT、DELETE等方法被认为是有潜在危险的。因为我们没有按照Django的要求在请求头/内容域中包含X-CSRFToken及相应的正确的值。Django会直接返回一个Http 403的错误回来。

解决的办法其实也很简单,就是按照要求提供这个值即可。在Django文档中有非常详细的描述() ,也给除了一个非常简单的方法。

然而我们总不能将官方提供的代码到处粘贴吧,还是做一个简单的封装较好: 

 

/** * 自动设置Django的csrf请求.要求jquery > 1.5.1 * 代码来自Django官网,做简单封装,直接引入此js即可. */(function(){    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');    function csrfSafeMethod(method) {        // these HTTP methods do not require CSRF protection        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));    }    $.ajaxSetup({        crossDomain: false, // obviates need for sameOrigin test        beforeSend: function(xhr, settings) {            if (!csrfSafeMethod(settings.type)) {                xhr.setRequestHeader("X-CSRFToken", csrftoken);            }        }    });})();

 

稍作解释:我们将官方提供的方法封装到一个匿名函数中,并通过在匿名函数外增加一对括号来强制js引擎将其视为一个表达式,返回值就是这个匿名函数,最后的一对括号则调用返回的这个匿名函数。

需要的时候只需要引入这个js即可。

转载于:https://www.cnblogs.com/Ankh/archive/2012/09/12/2681695.html

你可能感兴趣的文章
博客作业四
查看>>
Scanner 输入---从键盘输入两个数进行相加
查看>>
test
查看>>
说无可说
查看>>
mysql 语句优化
查看>>
SCP 命令参数使用详解(最详细使用指南)
查看>>
windows cmd color setup
查看>>
一些问题
查看>>
ubuntu配置cudnn
查看>>
P1242 新汉诺塔 && UVA10795 A Different Task
查看>>
从零开始学习PYTHON3讲义(十一)计算器升级啦
查看>>
从零开始学习PYTHON3讲义(三)写第一个程序
查看>>
WebGis设计模式
查看>>
cocos2dx ScrollView 测试一 触摸事件优先级和自动调整
查看>>
django 使用mysql数据库的流程
查看>>
Android系统移植与调试之------->如何修改Android设备的默认休眠时间
查看>>
我的Android进阶之旅------>Java文件大小转换工具类 (B,KB,MB,GB,TB,PB之间的大小转换)...
查看>>
uboot 传递的参数 mtdparts
查看>>
六种排序算法C语言版(上)
查看>>
292. Nim Game(easy)
查看>>