屬性
HttpRequest.scheme
New in Django 1.7.一個(gè)字符串,表示請(qǐng)求的方案(通常是http或https)。
HttpRequest.body
一個(gè)字節(jié)字符串,表示原始HTTP 請(qǐng)求的正文。
它對(duì)于處理非HTML 形式的數(shù)據(jù)非常有用:二進(jìn)制圖像、XML等。
如果要處理常規(guī)的表單數(shù)據(jù),應(yīng)該使用HttpRequest.POST。
你也可以使用”類文件“形式的接口從HttpRequest 中讀取數(shù)據(jù)。
參見HttpRequest.read()。
HttpRequest.path
一個(gè)字符串,表示請(qǐng)求的頁面的完整路徑,不包含域名。
例如:"/music/bands/the_beatles/"
HttpRequest.path_info
在某些Web 服務(wù)器配置下,主機(jī)名后的URL 部分被分成腳本前綴部分和路徑信息部分。
path_info 屬性將始終包含路徑信息部分,不論使用的Web 服務(wù)器是什么。使用它代替path可以讓代碼在測(cè)試和開發(fā)環(huán)境中更容易地切換。
例如
如果應(yīng)用的WSGIScriptAlias設(shè)置為/minfo,那么當(dāng)path是"/minfo/music/bands/the_beatles/" 時(shí)path_info將是"/music/bands/the_beatles/"。
HttpRequest.method
一個(gè)字符串,表示請(qǐng)求使用的HTTP 方法。必須使用大寫。
例如:if request.method == 'GET': do_something()elif request.method == 'POST': do_something_else()
HttpRequest.encoding
一個(gè)字符串,表示提交的數(shù)據(jù)的編碼方式(如果為None 則表示使用DEFAULT_CHARSET設(shè)置)。
這個(gè)屬性是可寫的,你可以修改它來修改訪問表單數(shù)據(jù)使用的編碼。接下來對(duì)屬性的任何訪問(例如從GET 或 POST中讀取數(shù)據(jù))將使用新的encoding 值。如果你知道表單數(shù)據(jù)的編碼不在DEFAULT_CHARSET中,則使用它。
HttpRequest.GET
一個(gè)類似于字典的對(duì)象,包含HTTP GET 的所有參數(shù)。詳情請(qǐng)參考下面的QueryDict文檔。
HttpRequest.POST
一個(gè)包含所有給定的HTTP POST參數(shù)的類字典對(duì)象,提供了包含表單數(shù)據(jù)的請(qǐng)求。詳情請(qǐng)參考下面的QueryDict文檔。
如果需要訪問請(qǐng)求中的原始或非表單數(shù)據(jù),可以使用HttpRequest.body屬性。
POST 請(qǐng)求可以帶有空的POST 字典 —— 如果通過HTTP POST 方法請(qǐng)求一個(gè)表單但是沒有包含表單數(shù)據(jù)的話。
因此,不應(yīng)該使用if request.POST 來檢查使用的是否是POST 方法;應(yīng)該使用if request.method == "POST"。
注意:POST 不包含上傳的文件信息。參見FILES。
HttpRequest.COOKIES
一個(gè)標(biāo)準(zhǔn)的Python 字典,包含所有的cookie。鍵和值都為字符串。
HttpRequest.FILES
一個(gè)類似于字典的對(duì)象,包含所有的上傳文件。
FILES中的每個(gè)鍵為<input type="file" name="" />中的name,
注意,F(xiàn)ILES只有在請(qǐng)求的方法為POST 且提交的<form>帶enctype="multipart/form-data"的情況下才會(huì)包含數(shù)據(jù)。否則,F(xiàn)ILES 將為一個(gè)空的類似于字典的對(duì)象。
HttpRequest.META
一個(gè)標(biāo)準(zhǔn)的Python 字典,包含所有的HTTP 頭部。
具體的頭部信息取決于客戶端和服務(wù)器,下面是一些示例:
CONTENT_LENGTH —— 請(qǐng)求的正文的長(zhǎng)度(是一個(gè)字符串)。
CONTENT_TYPE —— 請(qǐng)求的正文的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 —— 單個(gè)字符串形式的查詢字符串(未解析過的形式)。
REMOTE_ADDR —— 客戶端的IP 地址。
REMOTE_HOST —— 客戶端的主機(jī)名。
REMOTE_USER —— 服務(wù)器認(rèn)證后的用戶。
REQUEST_METHOD —— 一個(gè)字符串,例如"GET" 或"POST"。
SERVER_NAME —— 服務(wù)器的主機(jī)名。
SERVER_PORT —— 服務(wù)器的端口(是一個(gè)字符串)。
從上面可以看到,除CONTENT_LENGTH 和CONTENT_TYPE 之外,請(qǐng)求中的任何HTTP 頭部轉(zhuǎn)換為META 的鍵時(shí),都會(huì)將所有字母大寫并將連接符替換為下劃線最后加上HTTP_ 前綴。
所以,一個(gè)叫做X-Bender 的頭部將轉(zhuǎn)換成META 中的HTTP_X_BENDER 鍵。
HttpRequest.user
一個(gè)AUTH_USER_MODEL類型的對(duì)象,表示當(dāng)前登錄的用戶。
如果用戶當(dāng)前沒有登錄,user 將設(shè)置為django.contrib.auth.models.AnonymousUser 的一個(gè)實(shí)例。你可以通過is_authenticated()區(qū)分它們
像這樣:
if request.user.is_authenticated(): # Do something for logged-in users.else: # Do something for anonymous users.``user
只有當(dāng)Django 啟用AuthenticationMiddleware中間件時(shí)才可用。
HttpRequest.session
一個(gè)既可讀又可寫的類似于字典的對(duì)象,表示當(dāng)前的session信息。只有當(dāng)Django 啟用會(huì)話的支持時(shí)才可用。
HttpRequest.urlconf
不是由Django 自身定義的,但是如果其它代碼(例如,自定義的中間件類)設(shè)置了它,Django 就會(huì)讀取它。如果存在,它將用來作為當(dāng)前的請(qǐng)求的Root URLconf,并覆蓋ROOT_URLCONF設(shè)置。
HttpRequest.resolver_match
一個(gè)ResolverMatch的實(shí)例,表示解析后的URL。這個(gè)屬性只有在URL 解析方法之后才設(shè)置,這意味著它在所有的視圖中可以訪問,但是在在URL 解析發(fā)生之前執(zhí)行的中間件方法中不可以訪問(比如process_request,但你可以使用process_view 代替)。
方法
HttpRequest.get_full_path()
返回path,如果可以將加上查詢字符串。例如:"/music/bands/the_beatles/?print=true"
HttpRequest.build_absolute_uri(location)
返回location 的絕對(duì)URI。如果location 沒有提供,則設(shè)置為request.get_full_path()。
如果URI 已經(jīng)是一個(gè)絕對(duì)的URI,將不會(huì)修改。否則,使用請(qǐng)求中的服務(wù)器相關(guān)的變量構(gòu)建絕對(duì)URI。
例如:"http://example.com/music/bands/the_beatles/?print=true"
HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
返回簽名過的Cookie 對(duì)應(yīng)的值,如果簽名不再合法則返回django.core.signing.BadSignature。
如果提供default 參數(shù),將不會(huì)引發(fā)異常并返回default 的值。
可選參數(shù)salt 可以用來對(duì)安全密鑰強(qiáng)力攻擊提供額外的保護(hù)。
max_age 參數(shù)用于檢查Cookie 對(duì)應(yīng)的時(shí)間戳以確保Cookie 的時(shí)間不會(huì)超過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('non-existing-cookie')
...
KeyError: 'non-existing-cookie'
>>> request.get_signed_cookie('non-existing-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()
如果請(qǐng)求時(shí)是安全的,則返回True;即請(qǐng)求是通過HTTPS 發(fā)起的。
HttpRequest.is_ajax()
判斷是否通過ajax發(fā)送
如果請(qǐng)求是通過XMLHttpRequest 發(fā)起的,則返回True
方法是檢查HTTP_X_REQUESTED_WITH 頭部是否是字符串'XMLHttpRequest'。
大部分現(xiàn)代的JavaScript 庫都會(huì)發(fā)送這個(gè)頭部。如果你編寫自己的XMLHttpRequest 調(diào)用(在瀏覽器端),你必須手工設(shè)置這個(gè)值來讓is_ajax() 可以工作。
如果一個(gè)響應(yīng)需要根據(jù)請(qǐng)求是否是通過AJAX 發(fā)起的,并且你正在使用某種形式的緩存例如Django 的cachemiddleware, 你應(yīng)該使用vary_on_headers('HTTP_X_REQUESTED_WITH')裝飾你的視圖以讓響應(yīng)能夠正確地緩存。
HttpRequest.read(size=None)
HttpRequest.readline()
HttpRequest.readlines()
HttpRequest.xreadlines()
HttpRequest.__ iter__()
這幾個(gè)方法實(shí)現(xiàn)類文件的接口用于讀取HttpRequest·
實(shí)例。這使得可以用流的方式讀取進(jìn)來的請(qǐng)求。
一個(gè)常見的用例是使用迭代解析器處理大型XML有效載荷,而不在內(nèi)存中構(gòu)造一個(gè)完整的XML樹。
根據(jù)這個(gè)標(biāo)準(zhǔn)的接口,一個(gè)HttpRequest 實(shí)例可以直接傳遞給XML 解析器,
例如ElementTree:import xml.etree.ElementTree as ETfor element in ET.iterparse(request): process(element)