Django框架如何使用ajax的post方法


Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的软件设计模式,即模型M,视图V和控制器C。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。

今天在尝试调用jQuery的ajax时发现一个问题,就是使用GET方法服务器可以正常返回,但是使用POST方法却不行。后来再测试表单方式的POST的方法也不行。只要POST必报HTTP 403错误!非常奇怪。。。   

在网上搜了一大堆资料以后原来是因为Django的Cross Site Request Forgery protection机制的问题。这个机制是为了保护不受csrf攻击。什么是crsf攻击,桃林博客中有一段较为浅显的讲解。解决方案Django的官网已经提供了http://docs.djangoproject.com/en/dev/ref/contrib/csrf/,根据说明修改后,ajax可以顺利Post了。

具体办法是,首先解决表单的POST。在settings.py文件中找到 MIDDLEWARE_CLASSES,在其中加入一个中间件:'django.middleware.csrf.CsrfViewMiddleware' ,修改后的代码如下:

Python代码

MIDDLEWARE_CLASSES = ( 
 'django.middleware.common.CommonMiddleware', 
 'django.contrib.sessions.middleware.SessionMiddleware', 
 'django.middleware.csrf.CsrfViewMiddleware', 
 'django.contrib.auth.middleware.AuthenticationMiddleware', 
 'django.contrib.messages.middleware.MessageMiddleware', 
 'django.middleware.csrf.CsrfResponseMiddleware', #加入这个中间件 
) 

     经过这番修改,可以解决表单方式的POST提交HTTP 403问题了。ajax的Post提交仅这样改还不行。还需要钩上一个每次提交时的cookie处理过程。也就是每次提交的时候,都触发这个过程,在提交的http头上加入csrf token。不过还好,如果你是用jQuery来处理ajax的话,Django直接送了一段解决问题的代码。把它放在一个独立的js文件中,在html页面中都引入即可。注意这个js文件必须在jquery的js文件引入之后,再引入。代码我直接复制过来了,如下:

Js代码

$('html').ajaxSend(function(event, xhr, settings) { 
 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; 
 } 
 if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) { 
  // Only send the token to relative URLs i.e. locally. 
  xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); 
 } 
}); 

 经过这番折腾,算是可以正常用ajax与Django通信了。

Django中ajax的使用

 前端的ajax代码如下所示:

$.ajax({
 type:'GET',
 url:'/store/ds_mgmt_wx/ajax_handle',
 dataType:'html',
 success:function(data)
  {
   alert(data);
  },
 error:function(data)
 {
  alert(data); 
 }
});

后端的相应代码的返回方法如下:

if act_job == 'ajax_handle':
  return HttpResponse('ajax_handle')

关于Django框架如何使用ajax的post方法就介绍完了,看完之后有何感想,欢迎小伙伴们分享自己的见解,祝大家心情愉快,工作顺利。



相关阅读:
win10搜索功能不能用怎么办 win10搜索功能不能用解决办法
ubuntu 命令行中文乱码问题的解决方法
浅析PHP绘图技术
详解php设置session(过期、失效、有效期)
几种设置表单元素中文本输入框不可编辑的方法总结
C++空类及没有成员变量的类的大小实例分析
Android高级开发之性能优化典范
windows无法启动WLAN AutoConfig错误代码1068的解决办法
java执行Linux命令的方法
老版本PHP转义Json里的特殊字符的函数
C#实现向多线程传参的三种方式实例分析
IIS和.NET(1.1/2.0)的安装顺序及错误解决方法
jQuery插件之Tocify动态节点目录菜单生成器附源码下载
PHP根据session与cookie用户登录状态操作类的代码
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 辛集-石家庄北 宁陵县-郑州 沈阳北-哈密 晋城-兖州 长沙-大连 衡阳-临城 南靖-建宁县北 长春-新开 南平南-深州 无锡-平原 包头-扎兰屯 信阳东-扶余北 东安东-永城北 马鞍山-顺昌 邯郸东-新乡东 新县-济南 德惠-三江口 大庆西-红旗营 砀山-黄口 鹿寨北-南宁 佛山-柳州 孤山口-云彩岭 海口-佛山 白沟-霸州西 渭南北-北戴河 亚布力-大杨树东 扎赉诺尔西-迁安 衡山-柳州 四平-鄯善 达拉滨-红彦 开通-茂林 青岛-砀山南 尼勒克-定边 新乡-陇西 丹阳北-肥东 山海关-常州 青岛北-广元 深圳东-蓬安 关林-沈阳北 泊头-青州市 嘉兴南-沧州西 黄羊镇-陈官营 明城-朝阳镇 重庆北-渑池 湘潭-邵东 东莞东-蓬安 桦南-宝林 卧里屯-成吉思汗 襄阳-沧州 安达-鹤山 邢台-临城 通海-建水 上普雄-冕宁 瓦窑田-班猫箐 陇西-咸宁 樟树-亳州 铁力-成吉思汗 五原-廊坊北 包头东-鹤壁 益阳-定西 新余-涟源 诸城-枣庄西 朝阳村-白城 青水山-九三 春亭阁-塔尔根 宜春-温州 山海关-亚布力 新晃-上海南 河源-原平 泰宁-龙岩 眉山东-成都东 灵宝-永康 七苏木-查干芒和 福生庄-陶思浩 昆明-海阳 瓦房店-朝阳 齐齐哈尔-阳泉北 上店-桑根达来 莱阳-渭南 荣昌-小南海 六安去驻马店怎么坐车最便宜
从新锦江饭店到上海世博乘地铁怎么坐车可以直达世博园区吗
太原到临沂做客车怎么倒车,车费是多少,
有盘锦直接到山东荷泽的火车列车票吗
我是辽宁盘锦的,不知道大家谁开过腾翼C30这车到底怎么样啊,
从成都到泸州叙永,怎么坐车?
郑州可以买北京西到海口的票吗,有学生证这样的话还是可以半
苏州震泽镇到杭州怎么走
哈尔滨银行交医保费用本人去吗需要什么到那还需要填单子
宜昌公交_宜昌公交
从惠州坐车去澳门,请问应该如何乘车,坐到哪
济南到湖南列车火车票
广州列车站托运冰箱和空调到祁东要多少钱 有车票
从德阳到厦门火车列车线程,那位帅哥,给个详细的线程表嘛,我是
丹东发大水了 沈阳是不是也快了 听说今天把辽阳炸了保沈阳
徐州到鱼台的汽车票是多少有没有近期乘坐过的,我要知道确
上海南站到江西玉山的时刻表
临汾到杭州怎走汽车_临汾到杭州怎走火车
唐山207路早班在唐山发车是几点
莆田走高速到长乐机场
福州到厦门邮寄_福州到厦门邮寄
画栋朝飞南浦云
广州到连云港的列车票最便宜的要多少
青岛是否有新开的动车组车次
厦门到龙岩汽车闽FY1489电话
从韩城火车列车站怎么到陕西龙门煤化工有限责任公司
郑州晚上又到侯马的客车汽车吗
我要买2011年1月9号T63次的火车列车票,提前几天买
斗门白蕉车站有直达汽车到广州列车火车东站
从太原到沈阳的长途大客有几趟,都是几点发车

Copyright © 2016 phpStudy |