前言
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 | |
郵箱 | |
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