Django是一個開放原始碼的Web應用框架,由Python寫成,本文為大家介紹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複雜物件的方法(圖文教學)
關於Ajax中透過response在後台傳遞資料問題(含有程式碼,詳細解析)
以上是Django框架如何使用ajax的post方法(圖文教學)的詳細內容。更多資訊請關注PHP中文網其他相關文章!