Request和Response

一簿寂、request

REST framework的 Request 擴(kuò)展了標(biāo)準(zhǔn)的 HttpRequest,添加支持了REST framework靈活的request解析和request認(rèn)證


1.Request parsing


REST framework的Request對(duì)象提供了靈活的request解析,允許你用JSON數(shù)據(jù)或者其他的媒體類型處理request,和通常處理表單數(shù)據(jù)一樣 。

.date

request.data 返回request body的解析后的內(nèi)容盗飒,這和標(biāo)準(zhǔn)的request.POST和request.FILES屬性相似,除了以下這些:

  • 它包含所有的解析的內(nèi)容敌蜂,包括file和non-file輸入箩兽。
  • 他提供對(duì)HTTP方法的內(nèi)容的解析不止于POST,這意味著你可以存取基于PUT和PATCH的內(nèi)容的request。
  • 相對(duì)于只支持表單數(shù)據(jù)章喉,他提供了對(duì)REST framework靈活的request解析,例如你可以用處理表單數(shù)據(jù)一樣的方式處理JSON數(shù)據(jù)

.query_params

request.query_params是對(duì)于request.GET更準(zhǔn)確的命名同義詞身坐,為清楚起見,在你的代碼中,我們建議使用request.query_params來代替Django標(biāo)準(zhǔn)的request.GET秸脱。這樣能夠讓你的代碼庫更正確和清晰,可能包括任何的HTTP方法類型查詢參數(shù)部蛇,而不止于GET request.

.parsers

APIView類或@api_view裝飾將確保這個(gè)屬性將自動(dòng)設(shè)置為Parser的實(shí)例列表,根據(jù)parser_classes設(shè)置視圖或基于DEFAULT_PARSER_CLASSES設(shè)置摊唇。
通常你不需要訪問該屬性。

注意:
如果一個(gè)客戶端發(fā)送畸形的內(nèi)容,然后訪問request.data涯鲁,可能會(huì)導(dǎo)致一個(gè)ParseError巷查,默認(rèn)情況下 REST framework 的
APIView類或@api_view裝飾將捕獲錯(cuò)誤并返回一個(gè)400錯(cuò)誤請(qǐng)求響應(yīng)有序。
如果一個(gè)客戶端發(fā)送一個(gè)請(qǐng)求的內(nèi)容類型不能解析,將拋出UnsupportedMediaType異常,默認(rèn)情況下將被捕獲并返回一個(gè)415 Unsupported Media Type 響應(yīng)岛请。


2.Content negotiation(內(nèi)容協(xié)商)


request公開一些屬性旭寿,允許您確定內(nèi)容協(xié)商階段的結(jié)果。這允許您實(shí)現(xiàn)為不同的媒體類型選擇不同的連載方案等行為崇败。

.accepted_renderer

The renderer instance what was selected by the content negotiation stage.(渲染器實(shí)例選擇的內(nèi)容協(xié)商階段)

.accepted_media_type

一個(gè)字符串代表內(nèi)容協(xié)商階段接受的媒體類型盅称。


3.Authentication


REST framework 提供了靈活并且針對(duì)每個(gè)request的身份認(rèn)證系統(tǒng),他允許你實(shí)現(xiàn)以下功能:

  • 為你的API不同的部分選用不同的身份認(rèn)證策略
  • 提供了多個(gè)身份認(rèn)證使用策略
  • 通過傳入的request提供了用戶的token信息的關(guān)聯(lián)后室。

.user

request.user通常返回django.contrib.auth.models.User的實(shí)例缩膝,雖然這個(gè)行為取決于所使用的身份驗(yàn)證策略。
如果請(qǐng)求是未經(jīng)身份驗(yàn)證的岸霹,request.user的默認(rèn)值是django.contrib.auth.models.AnonymousUser的實(shí)例

For more details see the authentication documentation.

.auth

request.auth返回任何額外的身份認(rèn)證環(huán)境(context)疾层,request.auth具體的行為取決于使用的身份認(rèn)證策略,但是他通常是一個(gè)request身份認(rèn)證的token實(shí)例
如果request未經(jīng)身份驗(yàn)證贡避,或者沒有額外的環(huán)境痛黎,request.auth的默認(rèn)值為None。

For more details see the authentication documentation.

.authenticators

APIView類或@api_view裝飾將確保這個(gè)屬性將自動(dòng)設(shè)置為ofAuthentication實(shí)例列表,根據(jù)authentication_classes設(shè)置視圖或基于DEFAULT_AUTHENTICATORS設(shè)置贸桶。

通常你不需要訪問該屬性舅逸。


4.瀏覽器增強(qiáng)


REST framework 支持一些瀏覽器增強(qiáng),像基于瀏覽器的 PUT, PATCH 和 DELETE 形式皇筛。

.method

request.method返回request的HTTP方法的大寫字符串表示琉历。
基于瀏覽器的PUT,PATCH和DELETE形式是透明支持的。

For more information see the browser enhancements documentation.

.content_type

request.content_type 返回一個(gè)字符串對(duì)象代表HTTP的request body的媒體類型水醋。
如果沒有提供媒體類型則返回一個(gè)空字符串旗笔。
您通常不需要直接訪問請(qǐng)求的內(nèi)容類型,您將通常依賴于REST framework的默認(rèn)請(qǐng)求解析行為。
如果你需要訪問請(qǐng)求的內(nèi)容類型你應(yīng)該使用.content_type屬性優(yōu)先于使用request.META.get('HTTP_CONTENT_TYPE')拄踪,他提供基于瀏覽器的non-form內(nèi)容的透明支持蝇恶。

For more information see the browser enhancements documentation.

.stream

request.stream返回一個(gè)代表request body 內(nèi)容的流。
你通常不需要直接的訪問request的內(nèi)容惶桐,你將通常依賴于REST framework的默認(rèn)請(qǐng)求解析行為撮弧。
如果你需要直接訪問原始內(nèi)容,您應(yīng)該使用.stream屬性優(yōu)先于使用request.content。他提供基于瀏覽器的non-form內(nèi)容的透明支持姚糊。

For more information see the browser enhancements documentation.


5.標(biāo)準(zhǔn)HttpRequest屬性


正如REST framework的Request擴(kuò)展了Django的HttpRequest贿衍,所有其他標(biāo)準(zhǔn)的屬性和方法也可可用的,例如:request.META和request.session字典可以正常使用救恨。

注意,由于實(shí)現(xiàn)原因Request 類不從HttpRequest類繼承,而是使用擴(kuò)展類成分


二贸辈、response


REST framework 靠提供Response 類來支持HTTP內(nèi)容協(xié)商,這個(gè)類允許你返回可以被渲染多種內(nèi)容類型的的內(nèi)容肠槽,具體類型取決于客戶端的請(qǐng)求擎淤。

Response 類繼承于Django的SimpleTemplateResponse奢啥,Response 對(duì)象被初始化為本地的Python原始數(shù)據(jù)組成的數(shù)據(jù),REST framework使用標(biāo)準(zhǔn)的HTTP內(nèi)容協(xié)商來決定怎樣渲染最后的response數(shù)據(jù)嘴拢。
這里沒有要求你去使用Response 類桩盲,你可以根據(jù)需要在視圖中返回正規(guī)的HttpResponse 或者StreamingHttpResponse 對(duì)象。使用Response 類簡(jiǎn)單的提供了一個(gè)漂亮的接口來返回協(xié)商的內(nèi)容Web接口的響應(yīng)炊汤,這可以被渲染成多種形式正驻。
除非你因?yàn)橐恍┰蜻€要大量定制REST framework,你應(yīng)該一直在視圖中使用APIView 類或者@api_view函數(shù)返回Response 對(duì)象抢腐。這些允許視圖可以執(zhí)行內(nèi)容協(xié)商并為response選擇適當(dāng)?shù)匿秩酒鳌?/p>

1.Response()


Response(data, status=None, template_name=None, headers=None, content_type=None)

不像正規(guī)的HttpResponse對(duì)象姑曙,你不用渲染的內(nèi)容代替沒有渲染的數(shù)據(jù)實(shí)例化Response對(duì)象,這可能由一些Python的原始數(shù)據(jù)組成迈倍。(Unlike regular HttpResponse objects, you do not instantiate Response objects with rendered content. Instead you pass in unrendered data, which may consist of any Python primitives.)

Response類使用的渲染器不能在本地處理復(fù)雜的數(shù)據(jù)類型伤靠,就像Django的模型實(shí)例,所以你需要在創(chuàng)建Response對(duì)象之前啼染,先把數(shù)據(jù)序列化成原始的數(shù)據(jù)類型宴合。
你可以使用REST framework的Serializer 類來執(zhí)行這些數(shù)據(jù)序列化,或者使用你自己自定義的序列化器迹鹅。

參數(shù):

  • data:為response序列化的數(shù)據(jù)
  • status:為響應(yīng)狀態(tài)代碼卦洽。默認(rèn)為200。 See also status codes斜棚。
  • template_name:如果選用HTMLRenderer 阀蒂,為使用的模板名稱。
  • headers:response中使用的HTTP頭的字典弟蚀。
  • content_type:response中內(nèi)容的類型蚤霞。通常這回被內(nèi)容協(xié)商的渲染器設(shè)置成自動(dòng),但是這可能有一些原因你需要顯式地指定內(nèi)容類型义钉。

2.屬性


.data

Request 對(duì)象沒有渲染的內(nèi)容

.status_code

HTTP response的狀態(tài)碼

.content

response的渲染的內(nèi)容昧绣,在訪問.content之前必須先調(diào)用.render()方法。

.template_name

如果提供template_name捶闸,只需要HTMLRenderer 或者其他自定義模板渲染器是response接受的渲染器夜畴。

.accepted_renderer

用來渲染response的渲染器實(shí)例
在視圖中返回response之前被APIView 或者@api_view立即設(shè)置為自動(dòng)。

3.標(biāo)準(zhǔn)的HttpResponse屬性


Response類擴(kuò)展了SimpleTemplateResponse删壮,所有常用的屬性和方法在response中都是可用的斩启。例如你可以在response中用標(biāo)準(zhǔn)的方式設(shè)置headers。

response = Response()
response['Cache-Control'] = 'no-cache'

.render()

** 參數(shù):** .render()

與任何其他TemplateResponse一樣醉锅,這個(gè)方法被用來渲染response的序列化的數(shù)據(jù)到最后的response內(nèi)容。當(dāng).render()被調(diào)用時(shí)发绢,response的內(nèi)容會(huì)被設(shè)置成在accepted_renderer實(shí)例上調(diào)用.render(data, accepted_media_type, renderer_context) 方法的結(jié)果硬耍。
你通常不需要自己調(diào)用.render()垄琐,他被django的標(biāo)準(zhǔn)的response周期控制。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末经柴,一起剝皮案震驚了整個(gè)濱河市狸窘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坯认,老刑警劉巖翻擒,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異牛哺,居然都是意外死亡陋气,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門引润,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巩趁,“玉大人,你說我怎么就攤上這事淳附∫槲浚” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵奴曙,是天一觀的道長(zhǎng)别凹。 經(jīng)常有香客問我,道長(zhǎng)洽糟,這世上最難降的妖魔是什么炉菲? 我笑而不...
    開封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮脊框,結(jié)果婚禮上颁督,老公的妹妹穿的比我還像新娘。我一直安慰自己浇雹,他們只是感情好沉御,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著昭灵,像睡著了一般吠裆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上烂完,一...
    開封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天试疙,我揣著相機(jī)與錄音,去河邊找鬼抠蚣。 笑死祝旷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播怀跛,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼距贷,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤膛堤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后阁最,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骇两,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年速种,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脯颜。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哟旗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出栋操,到底是詐尸還是另有隱情闸餐,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布矾芙,位于F島的核電站舍沙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏剔宪。R本人自食惡果不足惜拂铡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望葱绒。 院中可真熱鬧感帅,春花似錦、人聲如沸地淀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帮毁。三九已至实苞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烈疚,已是汗流浹背黔牵。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爷肝,地道東北人猾浦。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓陆错,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親跃巡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子危号,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

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