Django2.0-views(3)-WSGIRequest物件和QueryDict物件
WSGIRequest物件
Django
在接收到http請求之後,會根據http請求攜帶的引數以及報文資訊建立一個WSGIRequest
物件,並且作為檢視函式第一個引數傳給檢視函式。也就是我們經常看到的request
引數。該類繼承於HttpRequst
在這個物件上我們可以找到客戶端上傳上來的所有資訊。這個物件的完整路徑是django.core.handlers.wsgi.WSGIRequest
。
WSGIRequest物件常用屬性
WSGIRequest
物件上大部分的屬性都是隻讀的。因為這些屬性是從客戶端上傳上來的,沒必要做任何的修改。以下將對一些常用的屬性進行講解:
-
path
:請求伺服器的完整“路徑”,但不包含域名和引數。比如http://www.baidu.com/xxx/yyy/
path
就是/xxx/yyy/
。 -
method
:代表當前請求的http
方法。比如是GET
還是POST
。 -
GET
:一個django.http.request.QueryDict
物件。操作起來類似於字典。這個屬性中包含了所有以?xxx=xxx
的方式上傳上來的引數,可以用request.GET.get("key_name")
來獲取。 -
POST
:也是一個django.http.request.QueryDict
物件。這個屬性中包含了所有以POST
方式上傳上來的引數。 -
FILES
:也是一個django.http.request.QueryDict
物件。這個屬性中包含了所有上傳的檔案。 -
COOKIES
cookie
,鍵值對都是字串型別。 -
session
:一個類似於字典的物件。用來操作伺服器的session
。 -
META
:儲存的客戶端傳送上來的所有header
資訊,可用字典方法。-
CONTENT_LENGTH
:請求的正文的長度(是一個字串)。 -
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
:伺服器埠號,是一個字串型別。
-
WSGIRequest物件常用方法
is_secure()
:是否是採用https
協議。is_ajax()
:是否採用ajax
傳送的請求。原理就是判斷請求頭中是否存在X-Requested-With:XMLHttpRequest
這個鍵值對。get_host()
:伺服器的域名。如果在訪問的時候還有埠號,那麼會加上埠號。比如www.baidu.com:9000
。get_full_path()
:返回完整的path。如果有查詢字串,還會加上查詢字串。比如/music/bands/?print=True
。get_raw_uri()
:獲取請求的完整url
。
QueryDict物件
-
from django.http.request import QueryDict
-
我們平時用的
request.GET
和request.POST
都是QueryDict
物件,這個物件繼承自dict
,因此用法跟dict
相差無幾。其中用得比較多的是get
方法和getlist
方法。get
方法:用來獲取指定key
的值,如果沒有這個key
,那麼會返回None
。可以指定default=xxx
引數getlist
方法:如果瀏覽器上傳上來的key
對應的值有多個,那麼就需要通過這個方法獲取。返回一個列表