一簿寂、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周期控制。