1. 程式人生 > >python-關於django中檢視及檢視集概括

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根檢視,返回一個包含所有列表檢視
    的超連結響應資料。