屬性
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)求的頁(yè)面的完整路徑陶衅,不包含域名。
例如:"/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è)屬性是可寫的,你可以修改它來(lái)修改訪問(wèn)表單數(shù)據(jù)使用的編碼慨丐。接下來(lái)對(duì)屬性的任何訪問(wèn)(例如從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文檔蓬痒。
如果需要訪問(wèn)請(qǐng)求中的原始或非表單數(shù)據(jù)泻骤,可以使用HttpRequest.body屬性。
POST 請(qǐng)求可以帶有空的POST 字典 —— 如果通過(guò)HTTP POST 方法請(qǐng)求一個(gè)表單但是沒(méi)有包含表單數(shù)據(jù)的話乳幸。
因此瞪讼,不應(yīng)該使用if request.POST 來(lái)檢查使用的是否是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)可接收的語(yǔ)言属瓣。
HTTP_HOST —— 客服端發(fā)送的HTTP Host 頭部载迄。
HTTP_REFERER —— Referring 頁(yè)面。
HTTP_USER_AGENT —— 客戶端的user-agent 字符串抡蛙。
QUERY_STRING —— 單個(gè)字符串形式的查詢字符串(未解析過(guò)的形式)护昧。
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)前沒(méi)有登錄,user 將設(shè)置為django.contrib.auth.models.AnonymousUser 的一個(gè)實(shí)例窝撵。你可以通過(guò)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ì)讀取它。如果存在魁兼,它將用來(lái)作為當(dāng)前的請(qǐng)求的Root URLconf婉徘,并覆蓋ROOT_URLCONF設(shè)置。
HttpRequest.resolver_match
一個(gè)ResolverMatch的實(shí)例咐汞,表示解析后的URL盖呼。這個(gè)屬性只有在URL 解析方法之后才設(shè)置,這意味著它在所有的視圖中可以訪問(wèn)碉考,但是在在URL 解析發(fā)生之前執(zhí)行的中間件方法中不可以訪問(wèn)(比如process_request,但你可以使用process_view 代替)挺身。
方法
HttpRequest.get_full_path()
返回path侯谁,如果可以將加上查詢字符串。例如:"/music/bands/the_beatles/?print=true"
HttpRequest.build_absolute_uri(location)
返回location 的絕對(duì)URI。如果location 沒(méi)有提供墙贱,則設(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)
返回簽名過(guò)的Cookie 對(duì)應(yīng)的值魁衙,如果簽名不再合法則返回django.core.signing.BadSignature报腔。
如果提供default 參數(shù),將不會(huì)引發(fā)異常并返回default 的值剖淀。
可選參數(shù)salt 可以用來(lái)對(duì)安全密鑰強(qiáng)力攻擊提供額外的保護(hù)纯蛾。
max_age 參數(shù)用于檢查Cookie 對(duì)應(yīng)的時(shí)間戳以確保Cookie 的時(shí)間不會(huì)超過(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('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)求是通過(guò)HTTPS 發(fā)起的。
HttpRequest.is_ajax()
判斷是否通過(guò)ajax發(fā)送
如果請(qǐng)求是通過(guò)XMLHttpRequest 發(fā)起的捌刮,則返回True
方法是檢查HTTP_X_REQUESTED_WITH 頭部是否是字符串'XMLHttpRequest'碰煌。
大部分現(xiàn)代的JavaScript 庫(kù)都會(huì)發(fā)送這個(gè)頭部。如果你編寫自己的XMLHttpRequest 調(diào)用(在瀏覽器端)绅作,你必須手工設(shè)置這個(gè)值來(lái)讓is_ajax() 可以工作芦圾。
如果一個(gè)響應(yīng)需要根據(jù)請(qǐng)求是否是通過(guò)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)來(lái)的請(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)