WSGIRequest對象
Django在接收到http請求之后,會根據http請求攜帶的參數以及報文信息創建一個WSGIRequest
對象,並且作為視圖函數第一個參數傳給視圖函數。這個參數就是django視圖函數的第一個參數,通常寫成request。在這個對象上我們可以找到客戶端上傳上來的所有信息。這個對象的完整路徑是django.core.handlers.wsgi.WSGIRequest
。
http請求的url詳解:
在了解WSGIRequest對象的屬性和方法之前,我們先了解一下url的組成,通常來說url的完整組成如下,[]為可選:
protocol ://hostname[:port]/path/[;parameters][?query]#fragment
- protocol: 網絡協議,常用的協議有http/https/ftp等
- hostname: 主機地址,可以是域名,也可以是IP地址
- port: 端口 http協議默認端口是:80端口,在瀏覽器中默認會隱藏不顯示
- path:路徑 網絡資源在服務器中的指定路徑
- parameter: 參數 如果要向服務器傳入參數,在這部分輸入
- query: 查詢字符串 如果需要從服務器那里查詢內容,在這里編輯
- fragment:片段 網頁中可能會分為不同的片段,如果想訪問網頁后直接到達指定位置,可以在這部分設置
WSGIRequest對象常用屬性:
WSGIRequest
對象上大部分的屬性都是只讀的。因為這些屬性是從客戶端上傳上來的,沒必要做任何的修改,在django視圖中使用時,視圖函數的第一個參數參數request就是WSGIRequest對象。以下將對一些常用的屬性進行講解:
path
:資源在服務器的完整“路徑”,但不包含域名和參數,在url中也是path的內容。比如http://www.baidu.com/xxx/yyy/
,那么path
就是/xxx/yyy/
。method
:代表當前請求的http
方法。比如是GET、
POST、delete或者是put等方法
GET
:一個django.http.request.QueryDict
對象。操作起來類似於字典。這個屬性中包含了所有以?xxx=xxx
的方式上傳上來的參數。POST
:也是一個django.http.request.QueryDict
對象。這個屬性中包含了所有以POST
方式上傳上來的參數。FILES
:也是一個django.http.request.QueryDict
對象。這個屬性中包含了所有上傳的文件。COOKIES
:一個標准的Python字典,包含所有的cookie
,鍵值對都是字符串類型。session
:一個類似於字典的對象。用來操作服務器的session
。-
user:user 只有當Django 啟用 AuthenticationMiddleware 中間件時才可用。它的值是一個 setting.py 里面AUTH_USER_MODEL 字段所定義的類的對象,表示當前登錄的用戶。如果用戶當前沒有登錄,user 將設為 django.contrib.auth.models.AnonymousUser 的一個實例。你可以通過 is_authenticated() 區分它們。
-
META
:存儲的客戶端發送上來的所有header
信息,下面是這些常用的header信息:-
CONTENT_LENGTH
:請求的正文的長度(是一個字符串)。 CONTENT_TYPE
:請求的正文的MIME類型。HTTP_ACCEPT
:響應可接收的Content-Type。HTTP_ACCEPT_ENCODING
:響應可接收的編碼,用於告知服務器客戶端所能夠處理的編碼方式和相對優先級。HTTP_ACCEPT_LANGUAGE
: 響應可接收的語言。HTTP_HOST
:客戶端發送的HOST值。HTTP_REFERER
:在訪問這個頁面上一個頁面的url。QUERY_STRING
:單個字符串形式的查詢字符串(未解析過的形式)。- TE:設置傳輸實體的編碼格式,表示請求發起者願意接收的Transfer-Encoding類型(傳輸過程中的編碼格式,代理服務器之間)
REMOTE_ADDR
:客戶端的IP地址。如果服務器使用了nginx
做反向代理或者負載均衡,那么這個值返回的是127.0.0.1
,這時候可以使用HTTP_X_FORWARDED_FOR
來獲取,所以獲取ip
地址的代碼片段如下:if request.META.has_key('HTTP_X_FORWARDED_FOR'): ip = request.META['HTTP_X_FORWARDED_FOR'] else: ip = request.META['REMOTE_ADDR']
REMOTE_HOST
:客戶端的主機名。REQUEST_METHOD
:請求方法。一個字符串類似於GET
或者POST
。SERVER_NAME
:服務器域名。SERVER_PORT
:服務器端口號,是一個字符串類型。
-
WSGIRequest對象常用方法:
is_secure()
:是否是采用https
協議。is_ajax()
:是否采用ajax
發送的請求。原理就是判斷請求頭中是否存在X-Requested-With:XMLHttpRequest
。get_host()
:服務器的域名。如果在訪問的時候還有端口號,那么會加上端口號,在url中就是hostname+port。比如www.baidu.com:9000
。get_full_path()
:返回完整的path。如果有查詢字符串,還會加上查詢字符串,在url中就是path以及其后面的所有。比如/music/bands/?print=True
。get_raw_uri()
:獲取請求的完整url
。
QueryDict對象:
我們平時用的request.GET、
request.POST和request.FILES
都是QueryDict
對象,這個對象繼承自dict
,因此用法跟dict
相差無幾。其中用得比較多的是get
方法和getlist
方法。
get
方法:用來獲取指定key
的值,如果沒有這個key
,那么會返回None
。getlist
方法:如果瀏覽器上傳上來的key
對應的值有多個,如果使用get取值,那么你只能取出最后面一個值,如果你想取到所有的值,那么就需要通過getlist這個方法獲取。