1. URL路徑參數
- 如果想從URL中獲取值,需要在正則表達式中使用
分組
, - 獲取值分為兩種方式
- 位置參數
- 參數的位置不能錯
- 關鍵字參數
- 參數的位置可以變,跟關鍵字保持一致即可
- 位置參數
- 注意:兩種參數的方式不要混合使用,在一個正則表達式中只能使用一種參數方式
位置參數
-
應用中
urls.py
url(r'^(\d+)/(\d+)/$', views.index)
說明:上面的路徑正則進行了分組,分組后,Django會按順序將這些值作為視圖方法的位置參數傳遞
-
視圖中函數: 參數的位置不能錯
def index(request, value1, value2): # 構造上下文 context = {'v1':value1, 'v2':value2} return render(request, 'Book/index.html', context)
說明:視圖第一個參數為默認參數,路由中的路徑參數從第二個開始按為位置參數傳遞到這里的value1和value2
關鍵字參數
-
應用中
urls.py
- 其中
?P<value1>
部分表示為這個參數定義名稱為value1
-
可以是其它名稱,起名要做到見名知意
url(r'^(?P<value1>\d+)/(?P<value2>\d+)/$', views.index),
說明:使用的是正則表達式中為分組命名的方式實現關鍵字參數傳遞,value1、value2會按關鍵字參數的方式傳遞給視圖
- 其中
-
視圖中函數: 參數的位置可以變,跟關鍵字保持一致即可
def index(request, value2, value1): # 構造上下文 context = {'v1':value1, 'v2':value2} return render(request, 'Book/index.html', context)
說明:推薦使用關鍵字參數,避免出錯
2. URL路徑上的請求參數(?后面拼接的參數)
如獲取到這個路徑后拼接的參數:
# /get/?a=1&b=2&a=3
獲取參數方法:使用視圖方法第一個參數request的GET屬性獲取
querydict = request.GET
request.GET獲取到的是一個QueryDict對象,QueryDict對象中有兩個方法,分別獲取參數名相同的單一參數值(上面參數中的b)和多個參數值(上面參數中的a)
-
方法get():根據鍵獲取值
如果一個鍵同時擁有多個值將獲取最后一個值
如果鍵不存在則返回None值,可以設置默認值進行后續處理
get('鍵',默認值)
-
方法getlist():根據鍵獲取值,值以列表返回,可以獲取指定鍵的所有值
如果鍵不存在則返回空列表[],可以設置默認值進行后續處理
getlist('鍵',默認值)
- 示例:
def get(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獲取請求中的查詢參數。
3. 請求體參數獲取
- 請求體數據格式不固定,可以是表單類型字符串,可以是JSON字符串,可以是XML字符串,應區別對待。
- 可以發送請求體數據的請求方式有POST、PUT、PATCH、DELETE。
- Django默認開啟了CSRF防護,會對上述請求方式進行CSRF防護驗證,在測試時可以關閉CSRF防護機制,方法為在settings.py文件中注釋掉CSRF中間件:
3.1 表單類型 Form Data
前端發送的表單類型的請求體數據,可以通過request.POST屬性獲取,返回QueryDict對象。
def post(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')
3.2 非表單類型 Non-Form Data
非表單類型的請求體數據,Django無法自動解析,可以通過request.body屬性獲取最原始的請求體數據,自己按照請求體格式(JSON、XML等)進行解析。request.body返回bytes類型。
例如要獲取請求體中的如下JSON數據
{"a": 1, "b": 2}
可以進行如下方法操作:
import json def post_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')
注意:
request.body獲取的是一個字符串
4.獲取請求頭信息
可以通過request.META屬性獲取請求頭headers中的數據,request.META為字典類型。
自定義頭信息時,系統自動在請求頭名稱前面拼接上了'HTTP_', 因此獲取的時候需要在前面加上'HTTP_', 如:我們傳遞自定義頭信息{"myhead": "abc"},獲取的時候:
print(request.META["HTTP_MYHEAD"]) # 頭信息名稱都為大寫
常見的請求頭如:
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')
注意:
頭信息中的key都為大寫,系統自動轉為大寫
5. 其他常用HttpRequest對象屬性
- method:一個字符串,表示請求使用的HTTP方法,常用值包括:'GET'、'POST'。
- user:請求的用戶對象。
- path:一個字符串,表示請求的頁面的完整路徑,不包含域名和參數部分。
-
encoding:一個字符串,表示提交的數據的編碼方式。
- 如果為None則表示使用瀏覽器的默認設置,一般為utf-8。
- 這個屬性是可寫的,可以通過修改它來修改訪問表單數據使用的編碼,接下來對屬性的任何訪問將使用新的encoding值。
-
FILES:一個類似於字典的對象,包含所有的上傳文件。