django 在 views 視圖函數中會(huì )傳一個(gè)request參數,request 是 HttpRequest 的實(shí)例對象。
當請求一個(gè)頁(yè)面時(shí),Django 創(chuàng )建一個(gè)HttpRequest對象,其中包含有關(guān)請求的元數據。然后 Django 加載適當的視圖,將傳遞HttpRequest給視圖函數的第一個(gè)參數。
每個(gè)視圖負責返回一個(gè)HttpResponse對象。
HttpRequest 的一些屬性和作用
| 屬性 | 說(shuō)明 |
|---|---|
| HttpRequest.scheme | 請求的協(xié)議,一般為http或者https |
| HttpRequest.body | 作為字節字符串的原始 HTTP 請求正文 |
| HttpRequest.path | 表示請求頁(yè)面的完整路徑的字符串,不包括方案或域。例子:“/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類(lèi)型(從CONTENT_TYPE頭部中獲取),django1.10的新特性。 |
| HttpRequest.content_params | 獲取CONTENT_TYPE中的鍵值對參數,并以字典的方式表示,django1.10的新特性。 |
| HttpRequest.GET | 返回一個(gè) querydict 對象(類(lèi)似于字典,本文最后有querydict的介紹),該對象包含了所有的HTTP GET參數 |
| HttpRequest.POST | 返回一個(gè) querydict ,該對象包含了所有的HTTP POST參數,通過(guò)表單上傳的所有 字符 都會(huì )保存在該屬性中。 |
| HttpRequest.COOKIES | 返回一個(gè)包含了所有cookies的字典。鍵和值是字符串。 |
| HttpRequest.FILES | 返回一個(gè)包含了所有的上傳文件的 querydict 對象。通過(guò)表單所上傳的所有 文件 都會(huì )保存在該屬性中。key的值是input標簽中name屬性的值,value的值是一個(gè)UploadedFile對象 |
| HttpRequest.META | 返回一個(gè)包含了所有http頭部信息的字典 |
| HttpRequest.resolver_match | ResolverMatch表示已解析 URL的實(shí)例。此屬性?xún)H在 URL 解析發(fā)生后設置,這意味著(zhù)它在所有視圖中可用,但在 URL 解析發(fā)生之前執行的中間件中不可用(process_view()盡管您可以使用它 ) |
| HttpRequest.current_app | 該url模板標簽將使用它的值作為current_app 參數reverse()。 |
| HttpRequest.urlconf | 這將用作當前請求的根 URLconf,覆蓋ROOT_URLCONF設置 |
| HttpRequest.session | 中間件屬性 來(lái)自SessionMiddleware:一個(gè)可讀可寫(xiě)的類(lèi)似字典的對象,表示當前會(huì )話(huà)。 |
| HttpRequest.site | 中間件屬性 來(lái)自CurrentSiteMiddleware: 代表當前站點(diǎn)的實(shí)例Site或 RequestSite作為返回 的實(shí)例get_current_site()。 |
| HttpRequest.user | 中間件屬性,表示當前登錄的用戶(hù)。來(lái)自AuthenticationMiddleware:AUTH_USER_MODEL代表當前登錄用戶(hù)的實(shí)例。 |
request.user
來(lái)自AuthenticationMiddleware:AUTH_USER_MODEL代表當前登錄用戶(hù)的實(shí)例。如果用戶(hù)當前未登錄,user則將設置為 的實(shí)例AnonymousUser。
你可以用 區分它們 is_authenticated,像這樣:
if request.user.is_authenticated:
... # Do something for logged-in users.
else:
... # Do something for anonymous users.HttpRequest.user實(shí)際上是由一個(gè)定義在django.contrib.auth.models 中的 user model 類(lèi) 所創(chuàng )建的對象。
該類(lèi)有許多字段,屬性和方法,常用字段:
| 字段 | 說(shuō)明 |
|---|---|
| username | 用戶(hù)名 |
| first_name | |
| last_name | |
| 郵箱 | |
| password | 密碼 |
| groups | |
| user_permissions | |
| is_staff | 布爾值,標明用戶(hù)是否可以訪(fǎng)問(wèn)admin頁(yè)面 |
| is_superuser | 是否超級管理員admin用戶(hù) |
| last_login | 上一次登陸時(shí)間 |
| date_joined | 用戶(hù)創(chuàng )建時(shí)間 |
屬性:
is_authenticated 布爾值,標志著(zhù)用戶(hù)是否已認證。在django1.10之前,沒(méi)有該屬性,但有與該屬性同名的方法。
方法:
| 方法 | 說(shuō)明 | 作用 |
|---|---|---|
| HttpRequest.user.get_username() | 注意:方法的圓括號在templates標簽中必需省略??!獲取username。盡量使用該方法來(lái)代替使用username字段 | |
| HttpRequest.user.get_full_name() | 注意:方法的圓括號在templates標簽中必需省略??!獲取first_name和last_name | |
| HttpRequest.user.short_name() | 注意:方法的圓括號在templates標簽中必需省略??!獲取first_name | |
| HttpRequest.user.set_password(raw_password) | 注意:該方法無(wú)法在template標簽中使用??!設置密碼 | |
| HttpRequest.user.check_password(raw_password) | 注意:該方法無(wú)法在template標簽中使用??!如果raw_password與用戶(hù)密碼相等,則返回True |
HttpRequest.META
包含所有可用 HTTP 標頭的字典??捎玫臉祟^取決于客戶(hù)端和服務(wù)器,但這里有一些示例:
| 屬性 | 說(shuō)明 |
|---|---|
| CONTENT_LENGTH | 請求正文的長(cháng)度(作為字符串)。 |
| CONTENT_TYPE | 請求正文的 MIME 類(lèi)型。 |
| HTTP_ACCEPT | 可接受的響應內容類(lèi)型。 |
| HTTP_ACCEPT_ENCODING | 可接受的響應編碼。 |
| HTTP_ACCEPT_LANGUAGE | 可接受的響應語(yǔ)言。 |
| HTTP_HOST | 客戶(hù)端發(fā)送的 HTTP Host 頭。 |
| HTTP_REFERER | 引用頁(yè)面,如果有的話(huà)。 |
| HTTP_USER_AGENT | 客戶(hù)端的用戶(hù)代理字符串。 |
| QUERY_STRING | 查詢(xún)字符串,作為單個(gè)(未解析的)字符串。 |
| REMOTE_ADDR | 客戶(hù)端的IP地址。 |
| REMOTE_HOST | 客戶(hù)端的主機名。 |
| REMOTE_USER | Web 服務(wù)器驗證的用戶(hù)(如果有)。 |
| REQUEST_METHOD | 一個(gè)字符串,例如”GET”or “POST”。 |
| SERVER_NAME | 服務(wù)器的主機名。 |
| SERVER_PORT | 服務(wù)器的端口(作為字符串)。 |
除了上面給出的CONTENT_LENGTHandCONTENT_TYPE之外,META通過(guò)將所有字符轉換為大寫(xiě),將所有連字符替換為下劃線(xiàn)并HTTP_在名稱(chēng)中添加前綴,請求中的任何 HTTP 標頭都會(huì )轉換為鍵。因此,例如,調用的標頭X-Bender將映射到METAkey HTTP_X_BENDER。
請注意,runserver刪除名稱(chēng)中帶有下劃線(xiàn)的所有標題,因此您不會(huì )在META. 這可以防止基于下劃線(xiàn)和破折號之間的歧義的標題欺騙,兩者都被規范化為 WSGI 環(huán)境變量中的下劃線(xiàn)。它與 Nginx 和 Apache 2.4+ 等 Web 服務(wù)器的行為相匹配。
HttpRequest.get_host() :使用來(lái)自HTTP_X_FORWARDED_HOST(如果USE_X_FORWARDED_HOST已啟用)和HTTP_HOST標頭中的信息以該順序返回請求的原始主機
HttpRequest.get_port() :使用來(lái)自HTTP_X_FORWARDED_PORT(如果USE_X_FORWARDED_PORT已啟用)和SERVER_PORT META變量的信息,按該順序返回請求的起始端口 。
HttpRequest.get_full_path():返回path,加上附加的查詢(xún)字符串(如果適用)。例子:"/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()。
如果位置已經(jīng)是絕對 URI,則不會(huì )更改。否則,絕對 URI 將使用此請求中可用的服務(wù)器變量構建。例如:
>>> 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如果簽名不再有效則引發(fā) 異常。如果您提供default參數,則異常將被抑制,而將返回默認值。
可選salt參數可用于提供額外保護,防止對您的密鑰進(jìn)行暴力破解。如果提供,max_age將根據附加到 cookie 值的簽名時(shí)間戳檢查該參數, 以確保 cookie 不超過(guò) 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)
FalseHttpRequest.is_secure() : True如果請求是安全的,則返回;也就是說(shuō),如果它是用 HTTPS 制作的。
HttpRequest.is_ajax():通過(guò)檢查字符串的標頭,返回True請求是否是通過(guò) an 發(fā)出的 。大多數現代 JavaScript 庫都會(huì )發(fā)送此標頭。如果您編寫(xiě)自己的調用(在瀏覽器端),則必須手動(dòng)設置此標頭才能工作。
HttpRequest.read( size=None )
HttpRequest.readline()
HttpRequest.readlines()
HttpRequest.__iter__()
實(shí)現用于從HttpRequest實(shí)例讀取的類(lèi)文件接口的方法 。這使得以流方式使用傳入請求成為可能。一個(gè)常見(jiàn)的用例是使用迭代解析器處理大型 XML 負載,而無(wú)需在內存中構建整個(gè) XML 樹(shù)。
給定這個(gè)標準接口,一個(gè)HttpRequest實(shí)例可以直接傳遞給一個(gè) 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
本期上課時(shí)間:7月17號-10月16號,每周六、周日晚上20:30-22:30
聯(lián)系客服