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的字典。
12 HttpRequest.FILES 返回一個包含了所有的上傳文件的 querydict 對象。通過表單所上傳的所有 文件 都會保存在該屬性中。
key的值是input標簽中name屬性的值,value的值是一個UploadedFile對象
13 HttpRequest.META 返回一個包含了所有http頭部信息的字典

14 HttpRequest.session 中間件屬性
15 HttpRequest.site 中間件屬性
16 HttpRequest.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
2 HttpRequest.get_port() django1.9的新特性。
3 HttpRequest.get_full_path() 返回完整路徑,並包括附加的查詢信息。example: "/music/bands/the_beatles/?print=true"
4 HttpRequest.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) 更新
3 QueryDict.values() 列出所有的值
4 QueryDict.items() 列出所有的鍵值對,若一個key有多個值,只顯示最后一個值。
5 QueryDict.pop(key) 刪除某個鍵值對
6 QueryDict.getlist(key) 根據輸入的key返回一個Python中的list
7 QueryDict.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')