HTTP協議向伺服器傳遞引數有幾種途徑?
1 URL路徑引數
在定義路由URL時,可以使用正則表示式提取引數的方法從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})/$'
2 Django中的QueryDict物件
定義在django.http.QueryDict
HttpRequest物件的屬性GET、POST都是QueryDict型別的物件
與python字典不同,QueryDict型別的物件用來處理同一個鍵帶有多個值的情況
方法get():根據鍵獲取值
如果一個鍵同時擁有多個值將獲取最後一個值
如果鍵不存在則返回None值,可以設定預設值進行後續處理
dict.get('鍵',預設值) 可簡寫為 dict['鍵']
方法getlist():根據鍵獲取值,值以列表返回,可以獲取指定鍵的所有值
如果鍵不存在則返回空列表[],可以設定預設值進行後續處理
dict.getlist('鍵',預設值)
3. 查詢字串Query String
獲取請求路徑中的查詢字串引數(形如?k1=v1&k2=v2),可以通過request.GET屬性獲取,返回QueryDict物件。
# /qs/?a=1&b=2&a=3
def qs(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 表單型別 Form Data
前端傳送的表單型別的請求體資料,可以通過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')
重要:只要請求體的資料是表單型別,無論是哪種請求方式(POST、PUT、PATCH、DELETE),都是使用request.POST來獲取請求體的表單資料。
4.2 非表單型別 Non-Form Data
非表單型別的請求體資料,Django無法自動解析,可以通過request.body屬性獲取最原始的請求體資料,自己按照請求體格式(JSON、XML等)進行解析。request.body返回bytes型別。
例如要獲取請求體中的如下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
– The length of the request body (as a string).CONTENT_TYPE
– The MIME type of the request body.HTTP_ACCEPT
– Acceptable content types for the response.HTTP_ACCEPT_ENCODING
– Acceptable encodings for the response.HTTP_ACCEPT_LANGUAGE
– Acceptable languages for the response.HTTP_HOST
– The HTTP Host header sent by the client.HTTP_REFERER
– The referring page, if any.HTTP_USER_AGENT
– The client’s user-agent string.QUERY_STRING
– The query string, as a single (unparsed) string.REMOTE_ADDR
– The IP address of the client.REMOTE_HOST
– The hostname of the client.REMOTE_USER
– The user authenticated by the Web server, if any.REQUEST_METHOD
– A string such as"GET"
or"POST"
.SERVER_NAME
– The hostname of the server.SERVER_PORT
– The port of the server (as a string).
具體使用如:
def get_headers(request):
print(request.META['CONTENT_TYPE'])
return HttpResponse('OK')
6 其他常用HttpRequest物件屬性
- method:一個字串,表示請求使用的HTTP方法,常用值包括:'GET'、'POST'。
- user:請求的使用者物件。
- path:一個字串,表示請求的頁面的完整路徑,不包含域名和引數部分。
- encoding:一個字串,表示提交的資料的編碼方式。
- 如果為None則表示使用瀏覽器的預設設定,一般為utf-8。
- 這個屬性是可寫的,可以通過修改它來修改訪問表單資料使用的編碼,接下來對屬性的任何訪問將使用新的encoding值。
- FILES:一個類似於字典的物件,包含所有的上傳檔案。