responses
rest framework提供了乙個response類來根據客戶端的請求方式返回不同型別的資料。
response類繼承自django的******templateresponse。response物件會初始化python格式的資料。rest framework使用標準的http協議內容決定最終返回的資料內容。
除了使用response之外,你還可以在你的檢視中使用httpresponse或者streaminghttpresponse物件。但是response會是乙個更好的選擇,因為它可以被渲染成更多的格式。
除非你想高度定製化rest framework,否則就在apiview和@api_view裡使用response返回內容,它能確保在檢視返回之前根據協議內容來確定返回資料格式。
creating response(建立response)
# 初始化語法
response(data, status=
none
, template_name=
none
, headers=
none
, content_type=
none
)"""
data: 用於建立response物件的序列化之後的資料
status:response的狀態碼。預設是200
template_name:模板名,選擇了htmlrender的時候使用
headers:用於response的http頭部內容字典
content_type:response的內容型別,一般情況都會自動設定。
"""
response和httpresponse不同的地方在於,前者不需要使用渲染轉換之後的資料來初始化,可以直接初始化python的資料型別。
但是response不能處理複雜的資料型別,例如django的model型別例項,在呼叫response之前必須把它們序列化成python的原始資料型別(dict、 list等)。可以通過drf的序列化器serializer或者自定義的序列化方式來序列化。
# 舉例說明
data = user.objects.
all(
)# return response(data) # 這是錯誤的,會丟擲異常
# 這裡呼叫了序列化器,返回的是序列化之後的資料,是可行的
response(self.get_serializer(data)
.data)
# 這裡自己手動轉換資料為列**式,是合法的
data =
[for i in data]
response(data)
屬性.data:response使用的已序列化的,未渲染的資料
.status_code:http返回的數字狀態碼
.content:渲染後的內容,呼叫.content之前必須保證.render()方法已被呼叫
.template_name:模板名,只有在指定了模板渲染方式的時候才需要
.accepted_renderer:將用於渲染response的渲染器例項。會自動設定
.accepted_media_type:**資料型別。會自動指定
.renderer_context:會傳遞給render方法的一些資訊字典。會自動設定
標準httpresponse屬性
response可以使用標準屬性和方法。例如設定http頭
response = response(
)response[
"cache-control"]=
"no-cache"
"""
.render():用於渲染序列化資料的方法。這個方法被呼叫之後,.content屬性就會被設定。
"""response.render(data, accepted_media_type, renderer_context)
# 不需要手動指定
官方文件之Cookie
蘋果文件翻譯內容 由於http協議的無狀態性,客戶端通常使用的持久化儲存資料都是來自於攜帶cookies的url網路請求 系統缺省會每次在傳送網路請求的時候在請求頭裡面設定cookie,我們通常沒有管理他,通過charles軟體抓包可以明顯的看到請求頭裡面多了個set cookie 引數 url l...
drf之自動生成介面文件
rest framework可以自動幫助我們生成介面文件。介面文件以網頁的方式呈現。自動介面文件能生成的是繼承自apiview及其子類的檢視。rest framewrok生成介面文件需要coreapi庫的支援。1 pip install coreapi 在總路由中新增介面文件路徑。文件路由對應的檢視...
drf框架介面文件
rest framework可以自動幫助我們生成介面文件。介面文件以網頁的方式呈現。自動介面文件能生成的是繼承自apiview及其子類的檢視。pip install coreapi 在總路由中新增介面文件路徑。文件路由對應的檢視配置為rest framework.documentation.incl...