HttpRequest對(duì)象

屬性

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)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市河闰,隨后出現(xiàn)的幾起案子科平,更是在濱河造成了極大的恐慌,老刑警劉巖姜性,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篮灼,死亡現(xiàn)場(chǎng)離奇詭異顾患,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)券躁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事〔槿兀” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵榜贴,是天一觀的道長(zhǎng)豌研。 經(jīng)常有香客問(wèn)我,道長(zhǎng)唬党,這世上最難降的妖魔是什么鹃共? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮初嘹,結(jié)果婚禮上及汉,老公的妹妹穿的比我還像新娘。我一直安慰自己屯烦,他們只是感情好坷随,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著驻龟,像睡著了一般温眉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上翁狐,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天类溢,我揣著相機(jī)與錄音,去河邊找鬼露懒。 笑死闯冷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的懈词。 我是一名探鬼主播蛇耀,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼坎弯!你這毒婦竟也來(lái)了纺涤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤抠忘,失蹤者是張志新(化名)和其女友劉穎撩炊,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體崎脉,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拧咳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了囚灼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骆膝。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡砾淌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谭网,到底是詐尸還是另有隱情,我是刑警寧澤赃春,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布愉择,位于F島的核電站,受9級(jí)特大地震影響织中,放射性物質(zhì)發(fā)生泄漏锥涕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一狭吼、第九天 我趴在偏房一處隱蔽的房頂上張望层坠。 院中可真熱鬧,春花似錦刁笙、人聲如沸破花。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)座每。三九已至,卻和暖如春摘悴,著一層夾襖步出監(jiān)牢的瞬間峭梳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工蹂喻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留葱椭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓口四,卻偏偏與公主長(zhǎng)得像孵运,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子窃祝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 當(dāng)請(qǐng)求一個(gè)頁(yè)面時(shí)掐松,Django 會(huì)建立一個(gè)包含請(qǐng)求元數(shù)據(jù)的 HttpRequest 對(duì)象。 當(dāng) Django 加載...
    SingleDiego閱讀 1,614評(píng)論 0 2
  • Refer to: www.threemeal.com/blog/12/ 中間件 中間件是一個(gè)鉤子框架粪小,它們可以介...
    蘭山小亭閱讀 16,493評(píng)論 9 165
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理大磺,服務(wù)發(fā)現(xiàn),斷路器探膊,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • HttpRequest對(duì)象(除非特殊說(shuō)明杠愧,所有屬性都是只讀,session屬性是個(gè)例外)HttpRequest.s...
    碼農(nóng)小楊閱讀 494評(píng)論 0 0
  • 2 為博客添加高級(jí)功能 上一章中逞壁,你創(chuàng)建了一個(gè)基礎(chǔ)的博客應(yīng)用×骷茫現(xiàn)在锐锣,利用一些高級(jí)特性,你要把它打造成一個(gè)功能完整的...
    lakerszhy閱讀 1,610評(píng)論 2 5