1. 程式人生 > 實用技巧 > 轉:django中request物件詳解

 轉: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,使用該方法便於移植。

  1. 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 Code

14 HttpRequest.session 中介軟體屬性

15HttpRequest.site   中介軟體屬性

16HttpRequest.user   中介軟體屬性,表示當前登入的使用者。

   HttpRequest.user實際上是由一個定義在django.contrib.auth.models 中的user model 類 所建立的物件。

   該類有許多欄位,屬性和方法。列舉幾個常用的: 獲取更詳細資訊-->官方文件

    1 欄位:

      username 使用者名稱

      first_name

      last_name

      email

      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')