Django框架如何使用ajax的post方法
Django是一個(gè)開放源代碼的Web應(yīng)用框架,由Python寫成。采用了MVC的軟件設(shè)計(jì)模式,即模型M,視圖V和控制器C。它最初是被開發(fā)來用于管理勞倫斯出版集團(tuán)旗下的一些以新聞內(nèi)容為主的網(wǎng)站的,即是CMS(內(nèi)容管理系統(tǒng))軟件。并于2005年7月在BSD許可證下發(fā)布。這套框架是以比利時(shí)的吉普賽爵士吉他手Django Reinhardt來命名的。
今天在嘗試調(diào)用jQuery的ajax時(shí)發(fā)現(xiàn)一個(gè)問題,就是使用GET方法服務(wù)器可以正常返回,但是使用POST方法卻不行。后來再測試表單方式的POST的方法也不行。只要POST必報(bào)HTTP 403錯(cuò)誤!非常奇怪。。。
在網(wǎng)上搜了一大堆資料以后原來是因?yàn)镈jango的Cross Site Request Forgery protection機(jī)制的問題。這個(gè)機(jī)制是為了保護(hù)不受csrf攻擊。什么是crsf攻擊,桃林博客中有一段較為淺顯的講解。解決方案Django的官網(wǎng)已經(jīng)提供了http://docs.djangoproject.com/en/dev/ref/contrib/csrf/,根據(jù)說明修改后,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)過這番修改,可以解決表單方式的POST提交HTTP 403問題了。ajax的Post提交僅這樣改還不行。還需要鉤上一個(gè)每次提交時(shí)的cookie處理過程。也就是每次提交的時(shí)候,都觸發(fā)這個(gè)過程,在提交的http頭上加入csrf token。不過還好,如果你是用jQuery來處理ajax的話,Django直接送了一段解決問題的代碼。把它放在一個(gè)獨(dú)立的js文件中,在html頁面中都引入即可。注意這個(gè)js文件必須在jquery的js文件引入之后,再引入。代碼我直接復(fù)制過來了,如下:
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)過這番折騰,算是可以正常用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方法就介紹完了,看完之后有何感想,歡迎小伙伴們分享自己的見解,祝大家心情愉快,工作順利。
- Django使用AJAX調(diào)用自己寫的API接口的方法
- Django 使用Ajax進(jìn)行前后臺交互的示例講解
- Django中使用jquery的ajax進(jìn)行數(shù)據(jù)交互的實(shí)例代碼
- 使用Python的Django框架結(jié)合jQuery實(shí)現(xiàn)AJAX購物車頁面
- 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í)現(xiàn)省市縣三級聯(lián)動效果
這篇文章主要為大家詳細(xì)介紹了AJAX實(shí)現(xiàn)省市縣三級聯(lián)動效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10詳解Ajax跨域(jsonp) 調(diào)用JAVA后臺
本篇文章主要介紹了詳解Ajax跨域(jsonp) 調(diào)用JAVA后臺 ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05基于CORS實(shí)現(xiàn)WebApi Ajax 跨域請求解決方法
這篇文章主要介紹了基于CORS實(shí)現(xiàn)WebApi Ajax 跨域請求解決方法,需要的朋友可以參考下2017-08-08js裝載xml文件然后發(fā)向服務(wù)器的實(shí)現(xiàn)代碼
js裝載xml文件然后發(fā)向服務(wù)器,具體的代碼可以參考下面的思路。2009-01-01AjaxFileUpload結(jié)合Struts2實(shí)現(xiàn)多文件上傳(動態(tài)添加文件上傳框)
本文是腳本之家小編給大家分享的AjaxFileUpload結(jié)合Struts2實(shí)現(xiàn)多文件上傳功能,如果項(xiàng)目需求是不確定多少個(gè)文件,我們需要?jiǎng)討B(tài)的添加文件上傳框,具體實(shí)現(xiàn)代碼大家參考下本文2017-09-09菜鳥蔡之Ajax復(fù)習(xí)第三篇(Ajax之無刷新登錄)
無刷新登錄大家也許沒寫過,但是一定都是聽說過的,很早以前就想用這個(gè)小技術(shù)在自己做的小項(xiàng)目中用一把了,但都沒有付出過實(shí)踐,在網(wǎng)上查也沒有查到具體完整的代碼,在這里,今天菜鳥蔡也來試了一把,獻(xiàn)丑了,希望對初學(xué)的童鞋有點(diǎn)幫助2012-11-11使用ajax技術(shù)無刷新動態(tài)調(diào)用股票信息
新浪的財(cái)金頻道一直感覺做得很好。但由于最近網(wǎng)速慢的緣故,查看股票信息時(shí)網(wǎng)頁老是打不開。這幾天一直在研究ajax,于是用jquery自己做了一個(gè)自動讀取新浪股票實(shí)時(shí)數(shù)據(jù)的頁面。2008-11-11