Django在接收到http請求以後,會根據http請求攜帶的參數以及報文信息建立一個WSGIRequest
對象,而且做爲視圖函數第一個參數傳給視圖函數。這個參數就是django視圖函數的第一個參數,一般寫成request。在這個對象上咱們能夠找到客戶端上傳上來的全部信息。這個對象的完整路徑是django.core.handlers.wsgi.WSGIRequest
。python
在瞭解WSGIRequest對象的屬性和方法以前,咱們先了解一下url的組成,一般來講url的完整組成以下,[]爲可選:nginx
protocol ://hostname[:port]/path/[;parameters][?query]#fragmentajax
WSGIRequest
對象上大部分的屬性都是隻讀的。由於這些屬性是從客戶端上傳上來的,不必作任何的修改,在django視圖中使用時,視圖函數的第一個參數參數request就是WSGIRequest對象。如下將對一些經常使用的屬性進行講解:django
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
:請求的正文的長度(是一個字符串)。cookie
CONTENT_TYPE
:請求的正文的MIME類型。 HTTP_ACCEPT
:響應可接收的Content-Type。 HTTP_ACCEPT_ENCODING
:響應可接收的編碼,用於告知服務器客戶端所可以處理的編碼方式和相對優先級。 HTTP_ACCEPT_LANGUAGE
: 響應可接收的語言。 HTTP_HOST
:客戶端發送的HOST值。 HTTP_REFERER
:在訪問這個頁面上一個頁面的url。 QUERY_STRING
:單個字符串形式的查詢字符串(未解析過的形式)。 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
:服務器端口號,是一個字符串類型。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
。咱們平時用的request.GET、
request.POST和request.FILES
都是QueryDict
對象,這個對象繼承自dict
,所以用法跟dict
相差無幾。其中用得比較多的是get
方法和getlist
方法。網絡
get
方法:用來獲取指定key
的值,若是沒有這個key
,那麼會返回None
。getlist
方法:若是瀏覽器上傳上來的key
對應的值有多個,若是使用get取值,那麼你只能取出最後面一個值,若是你想取到全部的值,那麼就須要經過getlist這個方法獲取。