Django中的request.GET和request.POST

Django的views.py中定義的函數的requst參數,可以讀request.method確定是POST還是GET

首先,request.GET 和 request.POST是兩個對象,類字典對象,提供和字典類似的接口,也有一些別的接口。

什麼是POST和GET,這與HTTP協議有關:

參考這篇博客:http://blog.csdn.net/gideal_wang/article/details/4316691

這篇博客介紹了兩者從原理上和表現形式上的區別,非常清晰,如有需要可閱讀原文,下面是一點小結和摘錄:

1、POST和GET是HTTP協議定義的與服務器交互的方法。GET一般用於獲取/查詢 資源信息,而POST一般用於更新 資源信息。還有另兩種方法是PUT和DELETE

2、POST和GET都可以與服務器交互完成查、改、增、刪的操作。

3、

(1)GET提交,請求的數據會附在URL之後(就是把數據放置在HTTP協議頭中),以?分割URL和傳輸數據,多個參數用&連接;例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。(一個簡單的url例子:http://127.0.0.1:8000/search/?q=Django 只有一個參數 所以沒用&)如果數據是英文字母/數字,原樣發送,如果是空格,轉換爲+,如果是中文/其他字符,則直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX爲該符號以16進製表示的ASCII。

  POST提交:把提交的數據放置在是HTTP包的包體中。上文示例中紅色字體標明的就是實際的傳輸數據

     因此,GET提交的數據會在地址欄中顯示出來,而POST提交,地址欄不會改變

    (2)傳輸數據的大小:首先聲明:HTTP協議沒有對傳輸的數據大小進行限制,HTTP協議規範也沒有對URL長度進行限制。

而在實際開發中存在的限制主要有:

GET:特定瀏覽器和服務器對URL長度有限制,例如IE對URL長度的限制是2083字節(2K+35)。對於其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於操作系統的支持。

因此對於GET提交時,傳輸數據就會受到URL長度的限制。

POST:由於不是通過URL傳值,理論上數據不受限。但實際各個WEB服務器會規定對post提交數據大小進行限制,Apache、IIS6都有各自的配置。

4、對於get方式,服務器端用Request.QueryString獲取變量的值,對於post方式,服務器端用Request.Form獲取提交的數據。


在Django Book中提到:

POST數據是來自HTML中的〈form〉標籤提交的,而GET數據可能來自〈form〉提交也可能是URL中的查詢字符串(the query string)。

Django Book第七章給出的代碼例子中,views.py的處理函數開始會驗證request.method是否爲POST:

確認request.method的值是’POST’。用戶瀏覽表單時這個值並不存在,當且僅當表單被提交時這個值纔出現。 (在後面的例子中,request.method將會設置爲’GET’,因爲在普通的網頁瀏覽中,瀏覽器都使用GET,而非POST)。判斷request.method的值很好地幫助我們將表單顯示與表單處理隔離開來。

如果在視圖裏通過POST獲取數據,那麼request.GET將爲空。

使用request.POST.get()方法 可以獲取表單指定鍵的值內容  並可以在獲取表單內容的同時提供一個默認值防止該鍵對應的值爲空



在Django中 request.POST常常和form對象一起用,用來初始化一個form  如下面所示 先判斷方法是否爲POST 然後用request.POST對已有的Form對象ContactForm進行初始化。request.POST本身也是類字典對象,所以可以用於Form的初始化。


[python] view plaincopy

  1. if request.method == 'POST':  

  2.     form = ContactForm(request.POST)  





附上一點摘記:

8)接受request的數據 
從post中取得數據,如果不存在則默認值爲1 
pageNumber = request.POST.get('pageNumber',1) 
從get中取得數據,如果不存在則默認值爲1 
pageNumber = request.GET.get('pageNumber',1) 
從所有請求中取得數據,如果不存在則默認值爲1 
pageNumber = request.REQUEST.get('pageNumber',1) 
判斷一個請求是post還是get方式 
if request.method == 'GET': 
對於request的操作可以參考 


http://www.woodpecker.org.cn/obp/django/django-faq/request_response.html


對於GET和POST提供的方法可以參考


http://djangobook.py3k.cn/appendixH/

如get、copy等方法的註解


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章