python-關於django中檢視及檢視集概括
==================================================檢視
Django REST framework提供的檢視主要作用"
控制序列化器的執行(檢驗,儲存,轉換資料)
控制資料庫查詢的執行
===============================Request和Response
Request : REST framework傳入檢視的Request不在是Django預設的HttpRequest,而是REST framework提供的
擴充套件了HttpRequest類的Request類的物件
REST framework 提供了Parser解析器,在接收到請求後會自動根據Content-Type指明的請求資料
型別(如JSON、表單等)將請求資料進行parse解析,解析為類字典物件儲存到Request物件中.
Request物件的資料是自動根據前端傳送資料的格式進行解析之後的結果
常用屬性:
request.data 返回解析之後的請求體資料,類似django中的request.POST和request.FILES屬性
包含了解析之後的檔案和非檔案資料
包含了對POST,PUT,PATCH請求方式解析後的資料
利用了REST framework的parsers解析器,不僅支援表單型別,也支援JSON資料
request.query_params 與django中的request.GET相同
Response : REST framework提供了一個響應類Response,構造物件時,響應的具體內容被渲染成前端需要的型別
REST framework提供了Renderer渲染器,根據請求頭中的Accept(接收請求型別宣告)轉換對應格式
可以更改預設
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': ( # 預設響應渲染類
'rest_framework.renderers.JSONRenderer', # json渲染器
'rest_framework.renderers.BrowsableAPIRenderer', # 瀏覽API渲染器
)
}
構造方式:Response(data,status=None, template_name=None, headers=None, content_type=None)
data 不要render處理後的資料,Response會用renderer渲染器處理data
data 不能是複雜的結構資料,如django模型類物件(先用serializer序列化後(字典)再傳給data
屬性: .data傳給response物件序列化後,但未render處理的資料
.status_code 狀態碼數字
.content 經過render處理後的資料
狀態碼: 1xx 資訊告知; 2xx 成功; 3xx 重定向; 4xx 客戶端錯誤; 5xx 伺服器錯誤
====================================檢視中基類
1. 兩個基類:
1. APIView from rest_framework.views import APIView
REST framework中提供的所有檢視的基類,繼承自django的view父類
兩者不同: 1> APIView傳入檢視方法中的是REST framework中的request物件,不是django中的HttpRequest
2> 檢視方法返回Response物件,為響應資料render符合前端的格式
3> 任何APIexception異常都會被撲捉到並處理成合適的響應資訊
4> 進行dispatch分發前,對請求進行身份驗證,許可權檢查,流量控制等
支援定義的屬性:
authentication_classes 列表或元祖,身份認證類
permissoin_classes 列表或元祖,許可權檢查類
throttle_classes 列表或元祖,流量控制類
2. GenericAPIView from rest_framework.generics import GenericAPIView
繼承自 APIView 主要增加了操作序列化器和資料庫查詢的方法,作用是為Minxin擴充套件類的執行提供方法支援,
關於序列化器使用的屬性和方法:
屬性: serializer_class 指明檢視使用的序列化器
方法: get_serializer_class(self) 返回序列化器類,預設返回serializer_class
get_serializer(self,*args,**kwargs) 返回序列化器類物件, 用於提供給擴充套件類使用
可以直接呼叫該方法
該方法在提供序列化器物件的時候,會向序列化器類物件的context屬性補充三個引數
request:當前檢視請求物件;view:當前請求的類檢視物件;format:當前請求期望返回的資料格式
關於資料庫查詢的屬性和方法:
屬性: queryset 指明使用的資料庫查詢集
方法: get_queryset(self) 返回檢視使用的查詢集,為擴充套件類使用,列表檢視和詳情檢視獲取資料的基礎
預設返回queryset屬性
get_object(self) 返回詳情檢視所需的模型類資料物件,給擴充套件類使用,在檢視中呼叫該方法獲取
詳情資訊的模型類物件,若模型類物件不存在,返回404,預設使用APIView提供的
check_object_permission檢查當前物件訪問許可權
其他可以設定的屬性:
pagination_class 指明分頁控制類
filter_backends 指明過濾控制後端
2.五個擴充套件類 需要搭配 GenericAPIView父類 五個擴充套件類的實現需要呼叫GenericAPIView提供的序列化器和資料查詢方法
作用 提供了幾種後端檢視對資料增刪改查處理流程的實現,直接繼承,減少程式碼量
1> ListModelMixin 列表檢視擴充套件類 提供了list(request,*args,**kwargs) 會對資料過濾和分頁 返回200
2> CreateModelMixin 建立檢視擴充套件類 提供了create(request,*args,**kwargs) 建立資源的檢視 返回201
3> RetrieveModelMixin 詳情檢視擴充套件類 retrieve(...)返回一個存在的資料物件 存在返回200 否則 404
4> UpdateModelMixin 更新檢視擴充套件類 update(...) 更新一個存在的資料物件 成功 200 序列化校驗失敗404
同時提供了partial_update(...) 實現區域性更新
5> DestoryModelMixin 刪除檢視擴充套件類 destory(...) 刪除一個存在的資料物件 成功204 不存在 404
3. 幾個可用子類檢視
1) CreateAPIView
提供 post 方法
繼承自: GenericAPIView、CreateModelMixin
2)ListAPIView
提供 get 方法
繼承自:GenericAPIView、ListModelMixin
3)RetrieveAPIView
提供 get 方法
繼承自: GenericAPIView、RetrieveModelMixin
4)DestoryAPIView
提供 delete 方法
繼承自:GenericAPIView、DestoryModelMixin
5)UpdateAPIView
提供 put 和 patch 方法
繼承自:GenericAPIView、UpdateModelMixin
6)ListCreateAPIView
提供 get、post方法
繼承自: GenericAPIView、ListModelMixin、CreateModelMixin
7)RetrieveUpdateAPIView
提供 get、put、patch方法
繼承自: GenericAPIView、RetrieveModelMixin、UpdateModelMixin
8)RetrieveUpdateDestoryAPIView
提供 get、put、patch、delete方法
繼承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin
======================================檢視集 ViewSet
作用:使用檢視集可以將一系列的邏輯相關的動作放到一個類中,不再實現get,post方法,而是實現動作list()等
只有在路由設定使用as_view()方法,將動作與請求方式對應上
list() 提供一組資料
retrieve() 提供單個數據
create() 建立資料
update() 儲存資料
destory() 刪除資料
常用檢視集父類:
1. ViewSet 繼承自APIView與ViewSetMixin 作用也和APIView相似,提供了身份驗證,許可權校驗,流量控制等
ViewSet主要通過繼承ViewSetMixin來實現呼叫as_view({'get':'list'})對映處理,list()方法需要寫
2. GenericViewSet 繼承自GenericAPIView 與 ViewSetMixin 對映處理時也提供了GenericAPIView方法
直接搭配Mixin擴充套件類使用,不用寫list()等方法
class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
3. ModelViewSet 繼承自GenericViewSet 同時包括了五個擴充套件類 ListModelMixin等
4. ReadOnlyModelViewSet 繼承自GenericViewSet 同時包括了ListModeMixin和RetrieveModelMixin
檢視集中定義附加action動作:
在檢視集中使用rest_framework.decorators.action裝飾器新增自定義動作
action裝飾器接收兩個引數:
methods:該action支援的請求方式,列表傳遞
detail:action中要處理的是否是檢視資源物件(即是否通過url路徑獲取主鍵)
True:使用通過url路徑獲取的主鍵對應的資料物件
False:不使用url獲取主鍵
action屬性, if self.actio == 'create'
=======================================路由Routers
兩個router實現快速設定路由資訊: from rest_framework.routers import SimpleRouter,DefaultRouter
自動設定路由:
routers = SimpleRouter()/DefaultRouter()
routers.register(books,views.BookInfoViewSet,base_name='books')
urlpatterns += routers.urls
DefaultRouter與SimpleRouter的區別是,DefaultRouter會多附帶一個預設的API根檢視,返回一個包含所有列表檢視
的超連結響應資料。