Django的htpp請求之WSGIRequest

WSGIRequest對象

Django在接收到http請求以後,會根據http請求攜帶的參數以及報文信息建立一個WSGIRequest對象,而且做爲視圖函數第一個參數傳給視圖函數。這個參數就是django視圖函數的第一個參數,一般寫成request。在這個對象上咱們能夠找到客戶端上傳上來的全部信息。這個對象的完整路徑是django.core.handlers.wsgi.WSGIRequestpython

http請求的url詳解:

在瞭解WSGIRequest對象的屬性和方法以前,咱們先了解一下url的組成,一般來講url的完整組成以下,[]爲可選:nginx

protocol ://hostname[:port]/path/[;parameters][?query]#fragmentajax

  • protocol: 網絡協議,經常使用的協議有http/https/ftp等
  • hostname: 主機地址,能夠是域名,也能夠是IP地址
  • port: 端口 http協議默認端口是:80端口,在瀏覽器中默認會隱藏不顯示
  • path:路徑 網絡資源在服務器中的指定路徑
  • parameter: 參數 若是要向服務器傳入參數,在這部分輸入
  • query: 查詢字符串 若是須要從服務器那裏查詢內容,在這裏編輯
  • fragment:片斷 網頁中可能會分爲不一樣的片斷,若是想訪問網頁後直接到達指定位置,能夠在這部分設置

 

WSGIRequest對象經常使用屬性:

WSGIRequest對象上大部分的屬性都是隻讀的。由於這些屬性是從客戶端上傳上來的,不必作任何的修改,在django視圖中使用時,視圖函數的第一個參數參數request就是WSGIRequest對象。如下將對一些經常使用的屬性進行講解:django

  1. path:資源在服務器的完整「路徑」,但不包含域名和參數,在url中也是path的內容。好比http://www.baidu.com/xxx/yyy/,那麼path就是/xxx/yyy/
  2. method:表明當前請求的http方法。好比是GET、POST、delete或者是put等方法
  3. GET:一個django.http.request.QueryDict對象。操做起來相似於字典。這個屬性中包含了全部以?xxx=xxx的方式上傳上來的參數。
  4. POST:也是一個django.http.request.QueryDict對象。這個屬性中包含了全部以POST方式上傳上來的參數。
  5. FILES:也是一個django.http.request.QueryDict對象。這個屬性中包含了全部上傳的文件。
  6. COOKIES:一個標準的Python字典,包含全部的cookie,鍵值對都是字符串類型。
  7. session:一個相似於字典的對象。用來操做服務器的session
  8. user:user 只有當Django 啓用 AuthenticationMiddleware 中間件時纔可用。它的值是一個 setting.py 裏面AUTH_USER_MODEL 字段所定義的類的對象,表示當前登陸的用戶。若是用戶當前沒有登陸,user 將設爲 django.contrib.auth.models.AnonymousUser 的一個實例。你能夠經過 is_authenticated() 區分它們。瀏覽器

  9. META:存儲的客戶端發送上來的全部header信息,下面是這些經常使用的header信息:服務器

    1.   CONTENT_LENGTH:請求的正文的長度(是一個字符串)。cookie

    2.   CONTENT_TYPE:請求的正文的MIME類型。
    3.   HTTP_ACCEPT:響應可接收的Content-Type。
    4.   HTTP_ACCEPT_ENCODING:響應可接收的編碼,用於告知服務器客戶端所可以處理的編碼方式和相對優先級。
    5.   HTTP_ACCEPT_LANGUAGE: 響應可接收的語言。
    6.   HTTP_HOST:客戶端發送的HOST值。
    7.   HTTP_REFERER:在訪問這個頁面上一個頁面的url。
    8.   QUERY_STRING:單個字符串形式的查詢字符串(未解析過的形式)。
    9.   TE:設置傳輸實體的編碼格式,表示請求發起者願意接收的Transfer-Encoding類型(傳輸過程當中的編碼格式,代理服務器之間)
    10.   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'] 
    11.   REMOTE_HOST:客戶端的主機名。
    12.   REQUEST_METHOD:請求方法。一個字符串相似於GET或者POST
    13.   SERVER_NAME:服務器域名。
    14.   SERVER_PORT:服務器端口號,是一個字符串類型。

WSGIRequest對象經常使用方法:

  1. is_secure():是不是採用https協議。
  2. is_ajax():是否採用ajax發送的請求。原理就是判斷請求頭中是否存在X-Requested-With:XMLHttpRequest
  3. get_host():服務器的域名。若是在訪問的時候還有端口號,那麼會加上端口號,在url中就是hostname+port。好比www.baidu.com:9000
  4. get_full_path():返回完整的path。若是有查詢字符串,還會加上查詢字符串,在url中就是path以及其後面的全部。好比/music/bands/?print=True
  5. get_raw_uri():獲取請求的完整url

QueryDict對象:

咱們平時用的request.GET、request.POST和request.FILES都是QueryDict對象,這個對象繼承自dict,所以用法跟dict相差無幾。其中用得比較多的是get方法和getlist方法。網絡

  1. get方法:用來獲取指定key的值,若是沒有這個key,那麼會返回None
  2. getlist方法:若是瀏覽器上傳上來的key對應的值有多個,若是使用get取值,那麼你只能取出最後面一個值,若是你想取到全部的值,那麼就須要經過getlist這個方法獲取。
相關文章
相關標籤/搜索