當請求一個頁面時舵稠,Django 會建立一個包含請求元數(shù)據(jù)的 HttpRequest 對象。 當 Django 加載對應(yīng)的視圖時录粱,HttpRequest 對象將作為視圖函數(shù)的第一個參數(shù)(即:request)雌桑。每個視圖會返回一個 HttpResponse 對象。
屬性
- HttpRequest.scheme
一個字符串荚恶,表示請求的方案(通常是 http 或 https)。
- HttpRequest.body
一個字節(jié)字符串,表示原始 HTTP 請求的正文倘待。
- HttpRequest.path
一個字符串,表示請求的頁面的完整路徑组贺,不包含域名凸舵。
例如:"/music/bands/the_beatles/"
- HttpRequest.path_info
在某些 Web 服務(wù)器配置下,主機名后的 URL 部分被分成腳本前綴部分和路徑信息部分锣披。path_info 屬性將始終包含路徑信息部分贞间,不論使用的 Web 服務(wù)器是什么。使用它代替 path 可以讓代碼在測試和開發(fā)環(huán)境中更容易地切換雹仿。
- HttpRequest.method
一個字符串增热,表示請求使用的 HTTP 方法。必須使用大寫胧辽。例如:
if request.method == 'GET':
do_something()
elif request.method == 'POST':
do_something_else()
- HttpRequest.encoding
一個字符串峻仇,表示提交的數(shù)據(jù)的編碼方式(如果為 None 則表示使用 DEFAULT_CHARSET 設(shè)置)。你可以通過修改它來修改訪問表單數(shù)據(jù)使用的編碼邑商。
- HttpRequest.GET
一個類似于字典的對象摄咆,包含 HTTP GET 的所有參數(shù)
- HttpRequest.POST
一個類似于字典的對象,包含所有給定的 HTTP POST參數(shù)人断,提供了包含表單數(shù)據(jù)的請求吭从。
- HttpRequest.COOKIES
一個標準的 Python 字典,包含所有的 cookie恶迈。鍵和值都為字符串涩金。
- HttpRequest.FILES
一個類似于字典的對象,包含所有的上傳文件。FILES 中的每個鍵為 <input type="file" name="" /> 中的 name步做。
- HttpRequest.META
一個標準的 Python 字典副渴,包含所有的 HTTP 頭部。具體的頭部信息取決于客戶端和服務(wù)器全度,下面是一些示例:
- CONTENT_LENGTH —— 請求的正文的長度(是一個字符串)煮剧。
- CONTENT_TYPE —— 請求的正文的MIME 類型。
- HTTP_ACCEPT —— 響應(yīng)可接收的Content-Type将鸵。
- HTTP_ACCEPT_ENCODING —— 響應(yīng)可接收的編碼勉盅。
- HTTP_ACCEPT_LANGUAGE —— 響應(yīng)可接收的語言。
- HTTP_HOST —— 客服端發(fā)送的HTTP Host 頭部顶掉。
- HTTP_REFERER —— Referring 頁面菇篡。
- HTTP_USER_AGENT —— 客戶端的user-agent 字符串。
- QUERY_STRING —— 單個字符串形式的查詢字符串(未解析過的形式)一喘。
- REMOTE_ADDR —— 客戶端的IP 地址驱还。
- REMOTE_HOST —— 客戶端的主機名。
- REMOTE_USER —— 服務(wù)器認證后的用戶凸克。
- REQUEST_METHOD —— 一個字符串议蟆,例如"GET" 或"POST"。
- SERVER_NAME —— 服務(wù)器的主機名萎战。
- SERVER_PORT —— 服務(wù)器的端口(是一個字符串)咐容。
從上面可以看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 之外蚂维,請求中的任何 HTTP 頭部轉(zhuǎn)換為 META 的鍵時戳粒,都會將所有字母大寫并將連接符替換為下劃線最后加上 HTTP_ 前綴。所以虫啥,一個叫做 X-Bender 的頭部將轉(zhuǎn)換成META 中的 HTTP_X_BENDER 鍵蔚约。
- HttpRequest.user
一個 AUTH_USER_MODEL 類型的對象,表示當前登錄的用戶涂籽。如果用戶當前沒有登錄苹祟,user 將設(shè)置為 django.contrib.auth.models.AnonymousUser 的一個實例。你可以通過 is_authenticated() 區(qū)分它們评雌,像這樣:
if request.user.is_authenticated():
# Do something for logged-in users.
else:
# Do something for anonymous users.
方法
- HttpRequest.get_host()
根據(jù)從 HTTP_X_FORWARDED_HOST(如果打開 USE_X_FORWARDED_HOST)和 HTTP_HOST 頭部信息返回請求的原始主機树枫。如果這兩個頭部沒有提供相應(yīng)的值,則使用 SERVER_NAME 和 SERVER_PORT景东,在 PEP 3333 中有詳細描述砂轻。
例如:"127.0.0.1:8000"
- HttpRequest.get_full_path()
返回 path,如果可以將加上查詢字符串斤吐。
例如:"/music/bands/the_beatles/?print=true"
- HttpRequest.build_absolute_uri(location)
返回 location 的絕對 URI搔涝。如果 location 沒有提供丝里,則設(shè)置為 request.get_full_path()。
如果 URI 已經(jīng)是一個絕對的URI体谒,將不會修改。否則臼婆,使用請求中的服務(wù)器相關(guān)的變量構(gòu)建絕對URI抒痒。
例如:"http://example.com/music/bands/the_beatles/?print=true"
- HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
返回簽名過的 Cookie 對應(yīng)的值,如果簽名不再合法則返回 django.core.signing.BadSignature颁褂。如果提供 default 參數(shù)故响,將不會引發(fā)異常并返回 default 的值。
可選參數(shù) salt 可以用來對安全密鑰強力攻擊提供額外的保護颁独。max_age 參數(shù)用于檢查 Cookie 對應(yīng)的時間戳以確保 Cookie 的時間不會超過 max_age 秒彩届。
- HttpRequest.is_secure()
如果請求時是安全的,則返回 True誓酒;即請求是通過 HTTPS 發(fā)起的樟蠕。
- HttpRequest.is_ajax()
如果請求是通過 XMLHttpRequest 發(fā)起的,則返回 True靠柑,方法是檢查 HTTP_X_REQUESTED_WITH 頭部是否是字符串 'XMLHttpRequest'寨辩。大部分現(xiàn)代的 JavaScript 庫都會發(fā)送這個頭部。如果你編寫自己的 XMLHttpRequest 調(diào)用(在瀏覽器端)歼冰,你必須手工設(shè)置這個值來讓 is_ajax() 可以工作靡狞。
如果一個響應(yīng)需要根據(jù)請求是否是通過 AJAX 發(fā)起的,并且你正在使用某種形式的緩存例如 Django 的 cache middleware隔嫡, 你應(yīng)該使用 vary_on_headers('HTTP_X_REQUESTED_WITH') 裝飾你的視圖以讓響應(yīng)能夠正確地緩存甸怕。
- HttpRequest.read(size=None)
- HttpRequest.readline()
- HttpRequest.readlines()
- HttpRequest.xreadlines()
- HttpRequest.__iter__()
這幾個方法實現(xiàn)類文件的接口用于讀取 HttpRequest 實例。這使得可以用流的方式讀取進來的請求腮恩。一個常見的用例是使用迭代解析器處理大型 XML 有效載荷梢杭,而不在內(nèi)存中構(gòu)造一個完整的 XML 樹。