python測試開發django-98.views視圖函數中request參數詳解


前言

django 在 views 視圖函數中會傳一個request參數,request 是 HttpRequest 的實例對象。
當請求一個頁面時,Django 創建一個HttpRequest對象,其中包含有關請求的元數據。然后 Django 加載適當的視圖,將傳遞HttpRequest給視圖函數的第一個參數。
每個視圖負責返回一個HttpResponse對象。

HttpRequest 屬性

HttpRequest 的一些屬性和作用

屬性 說明
HttpRequest.scheme 請求的協議,一般為http或者https
HttpRequest.body 作為字節字符串的原始 HTTP 請求正文
HttpRequest.path 表示請求頁面的完整路徑的字符串,不包括方案或域。例子: "/music/bands/the_beatles/"
HttpRequest.path_info 獲取具有 URL 擴展名的資源的附加路徑信息。相對於HttpRequest.path,使用該方法便於移植。
HttpRequest.method 獲取該請求的方法GET/POST/PUT...,比如:if request.method == 'GET'
HttpRequest.encoding 獲取請求中表單提交數據的編碼。
HttpRequest.content_type 獲取請求的MIME類型(從CONTENT_TYPE頭部中獲取),django1.10的新特性。
HttpRequest.content_params 獲取CONTENT_TYPE中的鍵值對參數,並以字典的方式表示,django1.10的新特性。
HttpRequest.GET 返回一個 querydict 對象(類似於字典,本文最后有querydict的介紹),該對象包含了所有的HTTP GET參數
HttpRequest.POST 返回一個 querydict ,該對象包含了所有的HTTP POST參數,通過表單上傳的所有 字符 都會保存在該屬性中。
HttpRequest.COOKIES 返回一個包含了所有cookies的字典。鍵和值是字符串。
HttpRequest.FILES 返回一個包含了所有的上傳文件的 querydict 對象。通過表單所上傳的所有 文件 都會保存在該屬性中。 key的值是input標簽中name屬性的值,value的值是一個UploadedFile對象
HttpRequest.META 返回一個包含了所有http頭部信息的字典
HttpRequest.resolver_match ResolverMatch表示已解析 URL的實例。此屬性僅在 URL 解析發生后設置,這意味着它在所有視圖中可用,但在 URL 解析發生之前執行的中間件中不可用(process_view()盡管您可以使用它 )
HttpRequest.current_app 該url模板標簽將使用它的值作為current_app 參數reverse()。
HttpRequest.urlconf 這將用作當前請求的根 URLconf,覆蓋ROOT_URLCONF設置
HttpRequest.session 中間件屬性 來自SessionMiddleware:一個可讀可寫的類似字典的對象,表示當前會話。
HttpRequest.site 中間件屬性 來自CurrentSiteMiddleware: 代表當前站點的實例Site或 RequestSite作為返回 的實例get_current_site()。
HttpRequest.user 中間件屬性,表示當前登錄的用戶。 來自AuthenticationMiddleware:AUTH_USER_MODEL代表當前登錄用戶的實例。

request.user

來自AuthenticationMiddleware:AUTH_USER_MODEL代表當前登錄用戶的實例。如果用戶當前未登錄,user則將設置為 的實例AnonymousUser。
你可以用 區分它們 is_authenticated,像這樣:

if request.user.is_authenticated:
    ... # Do something for logged-in users.
else:
    ... # Do something for anonymous users.

HttpRequest.user實際上是由一個定義在django.contrib.auth.models 中的 user model 類 所創建的對象。
該類有許多字段,屬性和方法,常用字段:

字段 說明
username 用戶名
first_name
last_name
email 郵箱
password 密碼
groups
user_permissions
is_staff 布爾值,標明用戶是否可以訪問admin頁面
is_superuser 是否超級管理員admin用戶
last_login 上一次登陸時間
date_joined 用戶創建時間

屬性:

is_authenticated 布爾值,標志着用戶是否已認證。在django1.10之前,沒有該屬性,但有與該屬性同名的方法。
方法:

方法 說明 作用
HttpRequest.user.get_username() 注意:方法的圓括號在templates標簽中必需省略!!獲取username。盡量使用該方法來代替使用username字段
HttpRequest.user.get_full_name() 注意:方法的圓括號在templates標簽中必需省略!!獲取first_name和last_name
HttpRequest.user.short_name() 注意:方法的圓括號在templates標簽中必需省略!!獲取first_name
HttpRequest.user.set_password(raw_password) 注意:該方法無法在template標簽中使用!!設置密碼
HttpRequest.user.check_password(raw_password) 注意:該方法無法在template標簽中使用!!如果raw_password與用戶密碼相等,則返回True

HttpRequest.META

包含所有可用 HTTP 標頭的字典。可用的標頭取決於客戶端和服務器,但這里有一些示例:

屬性 說明
CONTENT_LENGTH 請求正文的長度(作為字符串)。
CONTENT_TYPE 請求正文的 MIME 類型。
HTTP_ACCEPT 可接受的響應內容類型。
HTTP_ACCEPT_ENCODING 可接受的響應編碼。
HTTP_ACCEPT_LANGUAGE 可接受的響應語言。
HTTP_HOST 客戶端發送的 HTTP Host 頭。
HTTP_REFERER 引用頁面,如果有的話。
HTTP_USER_AGENT 客戶端的用戶代理字符串。
QUERY_STRING 查詢字符串,作為單個(未解析的)字符串。
REMOTE_ADDR 客戶端的IP地址。
REMOTE_HOST 客戶端的主機名。
REMOTE_USER Web 服務器驗證的用戶(如果有)。
REQUEST_METHOD 一個字符串,例如"GET"or "POST"。
SERVER_NAME 服務器的主機名。
SERVER_PORT 服務器的端口(作為字符串)。

除了上面給出的CONTENT_LENGTHandCONTENT_TYPE之外,META通過將所有字符轉換為大寫,將所有連字符替換為下划線並HTTP_在名稱中添加前綴,請求中的任何 HTTP 標頭都會轉換為鍵。因此,例如,調用的標頭X-Bender將映射到METAkey HTTP_X_BENDER。

請注意,runserver刪除名稱中帶有下划線的所有標題,因此您不會在META. 這可以防止基於下划線和破折號之間的歧義的標題欺騙,兩者都被規范化為 WSGI 環境變量中的下划線。它與 Nginx 和 Apache 2.4+ 等 Web 服務器的行為相匹配。

HttpRequest 方法

HttpRequest.get_host() :使用來自HTTP_X_FORWARDED_HOST(如果USE_X_FORWARDED_HOST已啟用)和HTTP_HOST標頭中的信息以該順序返回請求的原始主機
HttpRequest.get_port() :使用來自HTTP_X_FORWARDED_PORT(如果USE_X_FORWARDED_PORT已啟用)和SERVER_PORT META變量的信息,按該順序返回請求的起始端口 。
HttpRequest.get_full_path(): 返回path,加上附加的查詢字符串(如果適用)。例子: "/music/bands/the_beatles/?print=true"
HttpRequest.get_full_path_info(): Django 2.1 中的新功能。喜歡get_full_path(),但使用path_info代替 path。例子: "/minfo/music/bands/the_beatles/?print=true"
HttpRequest.build_absolute_uri( location=None ) 返回 的絕對 URI 形式location。如果未提供位置,則位置將設置為request.get_full_path()。
如果位置已經是絕對 URI,則不會更改。否則,絕對 URI 將使用此請求中可用的服務器變量構建。例如:

>>> request.build_absolute_uri()
'https://example.com/music/bands/the_beatles/?print=true'
>>> request.build_absolute_uri('/bands/')
'https://example.com/bands/'
>>> request.build_absolute_uri('https://example2.com/bands/')
'https://example2.com/bands/'

HttpRequest.get_signed_cookie( key , default=RAISE_ERROR , salt='' , max_age=None ): 返回簽名 cookie 的 cookie 值,或者django.core.signing.BadSignature如果簽名不再有效則引發 異常。如果您提供default參數,則異常將被抑制,而將返回默認值。
可選salt參數可用於提供額外保護,防止對您的密鑰進行暴力破解。如果提供,max_age將根據附加到 cookie 值的簽名時間戳檢查該參數, 以確保 cookie 不超過 max_age秒。
例如:

>>> request.get_signed_cookie('name')
'Tony'
>>> request.get_signed_cookie('name', salt='name-salt')
'Tony' # assuming cookie was set using the same salt
>>> request.get_signed_cookie('nonexistent-cookie')
...
KeyError: 'nonexistent-cookie'
>>> request.get_signed_cookie('nonexistent-cookie', False)
False
>>> request.get_signed_cookie('cookie-that-was-tampered-with')
...
BadSignature: ...
>>> request.get_signed_cookie('name', max_age=60)
...
SignatureExpired: Signature age 1677.3839159 > 60 seconds
>>> request.get_signed_cookie('name', False, max_age=60)
False

HttpRequest.is_secure() : True如果請求是安全的,則返回;也就是說,如果它是用 HTTPS 制作的。
HttpRequest.is_ajax():通過檢查字符串的標頭,返回True請求是否是通過 an 發出的 。大多數現代 JavaScript 庫都會發送此標頭。如果您編寫自己的調用(在瀏覽器端),則必須手動設置此標頭才能工作。
HttpRequest.read( size=None )
HttpRequest.readline()
HttpRequest.readlines()
HttpRequest.__iter__()
實現用於從HttpRequest實例讀取的類文件接口的方法 。這使得以流方式使用傳入請求成為可能。一個常見的用例是使用迭代解析器處理大型 XML 負載,而無需在內存中構建整個 XML 樹。
給定這個標准接口,一個HttpRequest實例可以直接傳遞給一個 XML 解析器,例如 ElementTree:

import xml.etree.ElementTree as ET
for element in ET.iterparse(request):
    process(element)

HttpRequest官方文檔地址https://docs.djangoproject.com/zh-hans/2.1/ref/request-response/#django.http.HttpRequest


免責聲明!

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



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