Django中的request.GET和request.POST

YingRu-bupt發表於2013-02-27

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的初始化。

    if request.method == 'POST':
        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等方法的註解

z愛

相關文章