Django請求詳講
在本篇博文開始前請大家回想一下,利用HTTP協議向服務器傳參有幾種途徑?
- 提取URL的特定部分,如/ weather /shanghai/ 2020,可以在服務器端的路由中用正則表達式(re)截取;
- 查詢字符串(query string),如:key1 = value1&key2 = value2;
- 請求體(body)中發送的數據,多種表單數據:json,xml;
- 在http報文中的頭部(header)
1.路徑參數
在定義路由URL時,可以使用正則表達式(re)提取參數的方法從URL中獲取請求參數,Django替換提取的參數直接傳遞到視圖的參數中
-
未命名參數按定義順序傳遞
url(r'^weather/([a-z]+)/(\d{4})/$', views.weather), def weather(request, city, year): print('city=%s' % city) print('year=%s' % year) return HttpResponse('OK')
-
命名參數按名字傳遞
url(r'^weather/(?P<city>[a-z]+)/(?P<year>\d{4})/$', views.weather), def weather(request, year, city): print('city=%s' % city) print('year=%s' % year) return HttpResponse('OK')
2.QueryDict對象
定義在django.http.QueryDict
HttpRequest對象的屬性GET,POST都是QueryDict類型的對象
與Python字典不同,QueryDict類型的對象用來處理同一個鍵帶有多個值的情況
-
方法get():
-
根據鍵獲取值
如果一個鍵同時擁有多個值將獲取最後一個值
如果鍵不存在則返回None值,可以設置替換值進行後續處理
dict.get('鍵',默認值) 可簡寫爲 dict['鍵']
-
方法getlist():
-
根據鍵獲取值,值以列表返回,可以獲取指定鍵的所有值
如果鍵不存在則返回空列表[],可以設置默認值進行後續處理
dict.getlist('鍵',默認值)
3.查詢字符串
獲取請求路徑中的查詢字符串參數(形如:k1 = v1&k2 = v2),可以通過request.GET屬性獲取,返回QueryDict對象。
訪問路徑:/user/qs/?a=1&b=2&a=3
def num(request):
a = request.GET.get('a')
b = request.GET.get('b')
alist = request.GET.getlist('a')
print(a) # 3
print(b) # 2
print(alist) # ['1', '3']
return HttpResponse('OK')
注意:查詢字符串不區分請求方式,假使客戶端進行POST方式的請求,依然可以通過request.GET獲取請求中的查詢字符串數據。
4.請求體調度
請求體數據格式不固定,可以是表單類型字符串,可以是JSON字符串,可以是XML字符串,應區別對待。
可以發送請求體數據的請求方式有POST,PUT,PATCH,DELETE。
Django開啓了CSRF防護:
通過上述請求方式進行CSRF防護驗證,在測試時可以關閉CSRF防護機制,方法爲在settings.py文件中註釋掉CSRF防護件(後續會說到其他方法)如:
4.1表單類型表格數據
前端發送的表單類型的請求體數據,可以通過request.POST屬性獲取,返回QueryDict對象。
def get_body(request):
a = request.POST.get('a')
b = request.POST.get('b')
alist = request.POST.getlist('a')
print(a)
print(b)
print(alist)
return HttpResponse('OK')
注意:request.POST只能獲取獲取POST方式的請求體表單數據。**
4.2非表單類型非表格數據
非表單類型的請求體數據,Django無法自動解析,可以通過request.body屬性獲取最原始的請求體數據,自己按照請求體格式(JSON,XML等)進行解析**。request.body返回字節類型。**
例如要獲取請求體中的如下JSON數據
{"a": 1, "b": 2}
可以進行如下方法操作:
import json
def get_body_json(request):
json_str = request.body
json_str = json_str.decode() # python3.6 無需執行此步
req_data = json.loads(json_str)
print(req_data['a'])
print(req_data['b'])
return HttpResponse('OK')
5.請求頭彙總
可以通過request.META屬性獲取請求頭headers中的數據,request.META爲字典類型。
常見的請求頭如下:
CONTENT_LENGTH
–請求主體的長度(以字符串形式)。CONTENT_TYPE
–請求正文的MIME類型。HTTP_ACCEPT
–響應可接受的內容類型。HTTP_ACCEPT_ENCODING
–響應的可接受編碼。HTTP_ACCEPT_LANGUAGE
–可接受的響應語言。HTTP_HOST
–客戶端發送的HTTP Host標頭。HTTP_REFERER
–推薦頁面(如果有)。HTTP_USER_AGENT
–客戶端的用戶代理字符串。QUERY_STRING
–查詢字符串,作爲單個(未分析)字符串。REMOTE_ADDR
–客戶端的IP地址。REMOTE_HOST
–客戶端的主機名。REMOTE_USER
–由Web服務器驗證的用戶(如果存在)。REQUEST_METHOD
–諸如"GET"
或字符串"POST"
。SERVER_NAME
–服務器的主機名。SERVER_PORT
–服務器的端口(以字符串形式)。
具體使用方法如:
def get_headers(request):
print(request.META['CONTENT_TYPE'])
return HttpResponse('OK')
6.HttpRequest對象屬性
-
method:一個字符串,表示請求使用的HTTP方法,常用值包括:‘GET’,‘POST’。
-
user:請求的用戶對象。
-
path:一個字符串,表示請求的頁面的完整路徑,不包含域名和參數部分。
-
encoding:一個字符串,表示提交的數據的編碼方式。
- 如果爲None則表示使用瀏覽器的替代設置,一般爲utf-8。
- 這個屬性是可寫的,可以通過修改它來修改訪問表單數據使用的編碼,然後對屬性的任何訪問將使用新的編碼值。
-
FILES:一個透析字典的對象,包含所有的上傳文件。
今天的知識點主在瞭解,希望大家在閱讀後有所收穫,歐耶,謝謝觀賞
-
@Author:HaoXuan