Django框架如何使用ajax的post方法
Django是一個(gè)開(kāi)放源代碼的Web應(yīng)用框架,由Python寫(xiě)成。采用了MVC的軟件設(shè)計(jì)模式,即模型M,視圖V和控制器C。它最初是被開(kāi)發(fā)來(lái)用于管理勞倫斯出版集團(tuán)旗下的一些以新聞內(nèi)容為主的網(wǎng)站的,即是CMS(內(nèi)容管理系統(tǒng))軟件。并于2005年7月在BSD許可證下發(fā)布。這套框架是以比利時(shí)的吉普賽爵士吉他手Django Reinhardt來(lái)命名的。
今天在嘗試調(diào)用jQuery的ajax時(shí)發(fā)現(xiàn)一個(gè)問(wèn)題,就是使用GET方法服務(wù)器可以正常返回,但是使用POST方法卻不行。后來(lái)再測(cè)試表單方式的POST的方法也不行。只要POST必報(bào)HTTP 403錯(cuò)誤!非常奇怪。。。
在網(wǎng)上搜了一大堆資料以后原來(lái)是因?yàn)镈jango的Cross Site Request Forgery protection機(jī)制的問(wèn)題。這個(gè)機(jī)制是為了保護(hù)不受csrf攻擊。什么是crsf攻擊,桃林博客中有一段較為淺顯的講解。解決方案Django的官網(wǎng)已經(jīng)提供了http://docs.djangoproject.com/en/dev/ref/contrib/csrf/,根據(jù)說(shuō)明修改后,ajax可以順利Post了。
具體辦法是,首先解決表單的POST。在settings.py文件中找到 MIDDLEWARE_CLASSES,在其中加入一個(gè)中間件:'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', #加入這個(gè)中間件 )
經(jīng)過(guò)這番修改,可以解決表單方式的POST提交HTTP 403問(wèn)題了。ajax的Post提交僅這樣改還不行。還需要鉤上一個(gè)每次提交時(shí)的cookie處理過(guò)程。也就是每次提交的時(shí)候,都觸發(fā)這個(gè)過(guò)程,在提交的http頭上加入csrf token。不過(guò)還好,如果你是用jQuery來(lái)處理ajax的話,Django直接送了一段解決問(wèn)題的代碼。把它放在一個(gè)獨(dú)立的js文件中,在html頁(yè)面中都引入即可。注意這個(gè)js文件必須在jquery的js文件引入之后,再引入。代碼我直接復(fù)制過(guò)來(lái)了,如下:
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'));
}
});
經(jīng)過(guò)這番折騰,算是可以正常用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);
}
});
后端的相應(yīng)代碼的返回方法如下:
if act_job == 'ajax_handle':
return HttpResponse('ajax_handle')
關(guān)于Django框架如何使用ajax的post方法就介紹完了,看完之后有何感想,歡迎小伙伴們分享自己的見(jiàn)解,祝大家心情愉快,工作順利。
- Django使用AJAX調(diào)用自己寫(xiě)的API接口的方法
- Django 使用Ajax進(jìn)行前后臺(tái)交互的示例講解
- Django中使用jquery的ajax進(jìn)行數(shù)據(jù)交互的實(shí)例代碼
- 使用Python的Django框架結(jié)合jQuery實(shí)現(xiàn)AJAX購(gòu)物車(chē)頁(yè)面
- django使用ajax post數(shù)據(jù)出現(xiàn)403錯(cuò)誤如何解決
- django中使用jquery ajax post數(shù)據(jù)出現(xiàn)403錯(cuò)誤的解決辦法(兩種方法)
- Django環(huán)境下使用Ajax的操作代碼
相關(guān)文章
Ajax提交參數(shù)的值中帶有html標(biāo)簽不能提交成功的解決辦法(ASP.NET)
這篇文章主要介紹了Ajax提交參數(shù)的值中帶有html標(biāo)簽不能提交成功的解決辦法(ASP.NET),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2016-12-12
通過(guò)Ajax請(qǐng)求動(dòng)態(tài)填充頁(yè)面數(shù)據(jù)的實(shí)例
今天小編就為大家分享一篇通過(guò)Ajax請(qǐng)求動(dòng)態(tài)填充頁(yè)面數(shù)據(jù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
javascript對(duì)XMLHttpRequest異步請(qǐng)求的面向?qū)ο蠓庋b
對(duì)XMLHttpRequest異步請(qǐng)求的面向?qū)ο蠓庋b,需要的朋友可以參考下。2009-12-12
通過(guò)Ajax方式上傳文件使用FormData進(jìn)行Ajax請(qǐng)求
這篇文章主要介紹了通過(guò)Ajax方式上傳文件使用FormData進(jìn)行Ajax請(qǐng)求的相關(guān)資料,需要的朋友可以參考下2016-08-08

