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 服务器 CMS SQL jQuery C# C++ java Android IOS oracle MongoDB PostgreSQL SQLite 交通频道 冯桥客运站 河南省商丘市睢阳区
孟关客运站 贵州省贵阳市花溪区
崧厦汽车站 浙江省绍兴市上虞市
日照西湖客运站 山东省日照市东港区
临海涌泉汽车站 浙江省台州市临海市
通化公路客运站 建设大街
杨店客运站 湖北省孝感市孝南区
青神高台客运站 四川省眉山市青神县
武坚汽车客运站 江苏省扬州市江都市
白城青山客运站 吉林省白城市洮北区
杨村车站 二零五省道
农安公路客运总站 农安路
无梁路口客运站 河南省许昌市禹州市
世纪华联超市汉中门汽车站店 汉中路278号
肥城桃园客运站 山东省泰安市肥城市
罗平阿鲁客运站 云南省曲靖市罗平县
新泰新龙车站 山东省泰安市新泰市
汽车站加油站 河北省承德市平泉县
沙洋客运站 湖北省荆门市沙洋县
常乐汽车客运站 广西壮族自治区北海市合浦县
舒兰白旗客运站 吉林省吉林市舒兰市
荆州菱湖客运 湖北省荆州市荆州区
流坝汽车站 四川省巴中市南江县
绥东客运站 一三零县道
运河路客运站 江苏省镇江市润州区
广州增城客运站 新桥路4
许昌艾庄乡汽车客运站 河南省许昌市许昌县
佛山小塘汽车站 三环路
槽渔滩客运站 四川省眉山市洪雅县
高县嘉乐镇客运站 四川省宜宾市高县
港关汽车渡口 湖北省荆州市公安县
小巷客运站 江西省宜春市丰城市
唐山丰南汽车站 花园路
古恰客运站 黑龙江省大庆市肇源县
汤沟客运站 江苏省连云港市灌南县
柳市汽车站 车站路
榆树八号客运站 吉林省长春市榆树市
南京长途汽车总站停车场 建宁路1号中央门汽车站
义乌宾王客运中心汽车入口 浙江省金华市义乌市
鹤溪汽车站 江苏省常州市武进区
资兴三都汽车站 湖南省郴州市资兴市
刁镇汽车站 山东省济南市章丘市
麻屯汽车站 河南省洛阳市老城区
中江县广福汽车站 四川省德阳市中江县
龙潭河汽车站 四川省达州市万源市
兴济客运站 李杜线与一零四国道交口北200米
屏山县大乘镇柏杨村客运站 四川省宜宾市屏山县
凯旋路客运站-公交车站 吉林省长春市德惠市
茶亭车站 江西省上饶市上饶县
庆云客运站 四川省达州市宣汉县
邵阳宝庆车站 湖南省邵阳市双清区
东门汽车站旅客出站口 福建省泉州市惠安县
杞县沙沃乡客运站 河南省开封市杞县
屯留县麟绛客运站 山西省长治市屯留县
含山县交通局城南客运站 安徽省巢湖市含山县
友好客运分站 二零四省道
旧堡客运站 四川省绵阳市平武县
鄂州中心汽车站 滨湖西路
永济客运站 湖南省衡阳市耒阳市
良田农村客运站 湖南省郴州市苏仙区
湘东汽车站 江西省萍乡市湘东区
北斗客运站 云南省大理白族自治州永平县
台州东站 浙江省台州市椒江区
常州客运中心 常州市天宁区竹林西路51号
永福汽车客运站 四川省乐山市沐川县
太丘乡客运站 河南省商丘市永城市
公安郑公客运站 湖北省荆州市公安县
上林汽车总站白圩客运站 五零七县道
小屯汽车站 东大线
项城汽车站 河南省.周口市.周口市项城市交通中路一号
西峡桑坪汽车站 河南省南阳市西峡县
洛宁小界客运站 河南省洛阳市洛宁县
汽车站邮政所 甘肃省定西市安定区
东辽泉太客运站 三零三国道
蓝山县公用型汽车站医务室 新站北路19号
沙田车站 站前路
彝良小草坝客运站 云南省昭通市彝良县
辛集田家庄客运站 回新公路
莘塔汽车客运站 江苏省苏州市吴江市
监利龚场客运站 湖北省荆州市监利县
板山坪客运站 河南省南阳市南召县
寻甸鸡街客运站 云南省昆明市寻甸回族彝族自治县
汽车站旅社 安徽省滁州市定远县
曲周汽车客运站 河北省邯郸市曲周县
中武客运站 湖南省常德市澧县
社旗县兴隆镇客运站 河南省南阳市社旗县
甬子峪客运站 辽宁省本溪市南芬区
东里满汽车站 河北省衡水市饶阳县
宋家塘汽车站 湖南省邵阳市邵东县
广西超大渠黎客运站 五一九县道
王楼客运站 河南省濮阳市范县
广州梯面汽车站 一零六国道
汉中汽车-公交车站 和平路汽车站
厦门杏林汽车站 杏前路130号
青化客运站 陕西省宝鸡市岐山县
鳌江汽车站 浙江省温州市平阳县
肥城市汽车站候车厅 山东省泰安市肥城市
岑川客运站 湖南省岳阳市平江县
靖位汽车站 湖南省邵阳市新宁县
夹江华头客运站 四川省乐山市夹江县

Copyright © 2016 phpStudy |