轉:django中request物件詳解
Request
我們知道當URLconf檔案匹配到使用者輸入的路徑後,會呼叫對應的view函式,並將HttpRequest物件 作為第一個引數傳入該函式。
我們來看一看這個HttpRequest物件有哪些屬性或者方法:
屬性:
1 HttpRequest.scheme 請求的協議,一般為http或者https,字串格式(以下屬性中若無特殊指明,均為字串格式)
2 HttpRequest.body http請求的主體,二進位制格式。
3 HttpRequest.path 所請求頁面的完整路徑(但不包括協議以及域名),也就是相對於網站根目錄的路徑。
4 HttpRequest.path_info 獲取具有 URL 副檔名的資源的附加路徑資訊。相對於HttpRequest.path,使用該方法便於移植。
- if the WSGIScriptAlias for your application is set to "/minfo", then path might be "/minfo/music/bands/the_beatles/" and path_info would be "/music/bands/the_beatles/".
5 HttpRequest.method 獲取該請求的方法,比如: GET POST .........
6 HttpRequest.encoding 獲取請求中表單提交資料的編碼。
7 HttpRequest.content_type 獲取請求的MIME型別(從CONTENT_TYPE頭部中獲取),django1.10的新特性。
8 HttpRequest.content_params 獲取CONTENT_TYPE中的鍵值對引數,並以字典的方式表示,django1.10的新特性。
9 HttpRequest.GET 返回一個querydict物件(類似於字典,本文最後有querydict的介紹),該物件包含了所有的HTTP GET引數
10 HttpRequest.POST 返回一個querydict,該物件包含了所有的HTTP POST引數,通過表單上傳的所有字元 都會儲存在該屬性中。
11 HttpRequest.COOKIES 返回一個包含了所有cookies的字典。
12HttpRequest.FILES 返回一個包含了所有的上傳檔案的querydict
key的值是input標籤中name屬性的值,value的值是一個UploadedFile物件
13HttpRequest.META 返回一個包含了所有http頭部資訊的字典
View Code14 HttpRequest.session 中介軟體屬性
15HttpRequest.site 中介軟體屬性
16HttpRequest.user 中介軟體屬性,表示當前登入的使用者。
HttpRequest.user實際上是由一個定義在django.contrib.auth.models 中的user model 類 所建立的物件。
該類有許多欄位,屬性和方法。列舉幾個常用的: 獲取更詳細資訊-->官方文件。
1 欄位:
username 使用者名稱
first_name
last_name
password
groups
user_permissions,
is_staff 布林值,標明使用者是否可以訪問admin頁面
is_superuser
last_login 上一次登陸時間
date_joined 使用者建立時間
2 屬性
is_authenticated 布林值,標誌著使用者是否已認證。在django1.10之前,沒有該屬性,但有與該屬性同名的方法。
3 方法
1 HttpRequest.user.get_username() 注意:方法的圓括號在templates標籤中必需省略!!
獲取username。儘量使用該方法來代替使用username欄位
2 HttpRequest.user.get_full_name() 注意:方法的圓括號在templates標籤中必需省略!!
獲取first_name和last_name
3 HttpRequest.user.short_name() 注意:方法的圓括號在templates標籤中必需省略!!
獲取first_name
4 HttpRequest.user.set_password(raw_password) 注意:該方法無法在template標籤中使用!!
設定密碼
5 HttpRequest.user.check_password(raw_password)注意:該方法無法在template標籤中使用!!
如果raw_password與使用者密碼相等,則返回True
方法:
1 HttpRequest.get_host() 返回請求的源主機。example: 127.0.0.1:8000
2HttpRequest.get_port() django1.9的新特性。
3HttpRequest.get_full_path() 返回完整路徑,幷包括附加的查詢資訊。example:"/music/bands/the_beatles/?print=true"
4HttpRequest.bulid_absolute_uri(location) 返回location的絕對uri,location預設為request.get_full_path()。
Example: "https://example.com/music/bands/the_beatles/?print=true"
QueryDict
是一個類似於Python中字典的一種物件,他是Python中字典的子類,所以繼承了字典的所有方法,
當然QueryDict對字典的某些方法進行了加工,並補充了一些獨特的方法。這裡列出部分方法。詳情請看:官方文件。
1 QueryDict.get(key,default=None) 返回key所對應的value,若key不存在,則返回default的值
2 QueryDict.update(other_dict) 更新
3QueryDict.values() 列出所有的值
4QueryDict.items() 列出所有的鍵值對,若一個key有多個值,只顯示最後一個值。
5QueryDict.pop(key) 刪除某個鍵值對
6QueryDict.getlist(key) 根據輸入的key返回一個Python中的list
7QueryDict.dict() 返回QueryDict的字典的表現形式
附加解釋示例:
通常HTTP協議向伺服器傳參有幾種途徑 :
提取URL的特定部分,如/weather/shanghai/2018,可以在伺服器端的路由中用正則表示式擷取;
查詢字串(query string),形如key1=value1&key2=value2;
請求體(body)中傳送的資料,比如表單資料、json、xml;
在http報文的頭(header)中。
1.URL中引數的獲取
在定義路由URL時,可以使用正則表示式提取引數的方法從URL中獲取請求引數,Django會將提取的引數直接傳遞到檢視的傳入引數中。
一、未命名引數按定義順序傳遞
注意:引數獲取的順序與url中引數的位置一一對應,不能互換
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')
二、命名引數按名字傳遞
注意:如果在路由中指定了引數的名字,name接收引數時,必須要使用路由中指定的引數名稱,不能換成其他名字,此時,兩個引數位置可以互換。
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.獲取請求路徑中的查詢字串引數
(形如?k1=v1&k2=v2),可以通過request.GET屬性獲取,返回QueryDict物件。
什麼是QueryDict物件?
定義在django.http.QueryDict
HttpRequest物件的屬性GET、POST都是QueryDict型別的物件
與python字典不同,QueryDict型別的物件用來處理同一個鍵帶有多個值的情況
【1】方法get():根據鍵獲取值
如果一個鍵同時擁有多個值將獲取最後一個值
如果鍵不存在則返回None值,可以設定預設值進行後續處理
dict.get('鍵',預設值) 可寫為: dict['鍵']
【2】方法getlist():根據鍵獲取值,值以列表返回,可以獲取指定鍵的所有值
如果鍵不存在則返回空列表[],可以設定預設值進行後續處理
dict.getlist('鍵',預設值)
獲取引數例項
訪問路徑:/user/qs/?a=10&b=20&a=30
url(r'^qs/$',views.qs,name='qs'),
def qs(request):
a = request.GET.get('a') #30
b = request.GET.get('b') #20
num_list = request.GET.getlist('a') #['10','30']
print(a)
print(b)
print(num_list)
return HttpResponse(reverse('user:qs'))
重要:查詢字串不區分請求方式,即假使客戶端進行POST方式的請求,依然可以通過request.GET獲取請求中的查詢字串資料。
3.請求體中的引數
3.1表單資料獲取
通過request.POST來獲取
注意:Django預設開啟了CSRF防護,會對上述請求方式進行CSRF防護驗證,在測試時可以關閉CSRF防護機制,方法為在settings.py檔案中註釋掉CSRF中介軟體
url(r'^getbody/$',views.get_body),
def get_body(request):
form_data = request.POST.get('c')
print(form_data)
return HttpResponse(form_data)
3.2非表單資料獲取
非表單型別的請求體資料,Django無法自動解析,可以通過request.body屬性獲取最原始的請求體資料,自己按照請求體格式(JSON、XML等)進行解析。request.body返回bytes型別
import json
url(r'^getjson/$',views.get_body_json),
def get_body_json(request):
# 得到的是一個二進位制資料
json_str = request.body
print(json_str) # b'{\n "f":200,\n "d":300\n \n}'\
# 對二進位制資料進行解碼,解碼得到json資料
json_str = json_str.decode()
print(json_str) # {"f":200,"d":300}
# 將json資料轉化成字典形式
json_data = json.loads(json_str)
print(json_data) # {'f': 200, 'd': 300}
# 獲取json資料,使用字典方式取值
print(json_data['d']) # 300
print(json_data['f']) # 200
return HttpResponse('ok')
4.其他常用HttpRequest物件屬性
request.method 請求方式
request.path 請求路徑
request.user 請求的使用者物件
request.FILES 一個類似於字典的物件,包含所有的上傳檔案
request.encoding 一個字串,表示請求的頁面的完整路徑,不包含域名和引數部分。
url(r'^otherattr/$', views.other_attr),
def other_attr(request):
print(request.method) # POST
print(request.path) # /user/otherattr/
print(request.encoding) # None:表示使用瀏覽器的預設設定,一般為utf-8,這個屬性是可寫的,
# 可以通過修改它來修改訪問表單資料使用的編碼,接下來對屬性的任何訪問將使用新的encoding值。
return HttpResponse('success')