django的htpp請求之WSGIRequest


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對象。以下將對一些常用的屬性進行講解:

  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:請求的正文的長度(是一個字符串)。

    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這個方法獲取。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM