1. 程式人生 > 實用技巧 >Django---子框架drf內容總結

Django---子框架drf內容總結

目錄

1 restful規範--10條

2 django上寫符合restful規範的介面

3 drf寫介面

4 APIView--》繼承了原生View---》get,post方法

-(為什麼get請求來了,就會執行get方法:原生View的dispatch控制的)
-路由配置:檢視類.as_view()---->view(閉包函式)的記憶體地址
-請求來了,就會執行view(requst,分組分出的欄位,預設傳的欄位)---》self.dispatch()-->處理的

-APIView重寫了dispatch:包裝了request物件,解析器,分頁,三大認證,響應器,全域性異常,去掉了csrf

5 Request物件:request.request,request.data,重寫了__getattr_,request.method-->去原生request中拿

-前端傳過來的資料從那取?
	-位址列裡:request.GET/query_params
   	-請求體中的資料:request.data/POST(json格式解釋不了)---》request.body中取
    -請求頭中資料:request.META.get("HTTP_變成大寫")

6 Response物件---》封裝了原生的HttpResponse,Response(data,headers={},status=1/2/3/4/5開頭的)

7 自己封裝了Response物件

8 序列化類:

-Serializer
	-寫欄位,欄位名要跟表的欄位對應,想不對應(source可以修改),有屬性,read_only,max_len...
    -SerializerMethodField必須配套一個get_欄位名,返回什麼,前臺就看到什麼
-ModelSerializer
	-class Meta:
    	表對應
        取出的欄位(__all__,列表)
        排除的欄位(用的很少)
        extra_kwargs會給欄位的屬性
        
    -重寫某個欄位
    	password=serializers.SerializerMethodField()
        def get_password(self,instance):
            return "***"
    -校驗:欄位自己的校驗,區域性鉤子,全域性鉤子
    	-只要序列化類的物件執行了is_valiad(),這些鉤子都會走,可以再鉤子裡寫邏輯
    -在表模型(model)中寫方法,可以在上面取出的欄位中直接寫,不參與反序列化

-序列化多條(many=True):本質,ListSerializer內部套了一個個的serializer物件
-重寫ListSerializer,讓序列化物件和自己寫的ListSerializer對應上(瞭解)
-序列化類(instance,data,many,context={requtst:request})
-檢視函式中給序列化物件傳遞資料,使用context,傳回來,放進去直接使用序列化物件.context.get()

9 檢視

-兩個檢視基類 APIView,GenericAPIView(繼承APIView):涉及到資料庫和序列化類的操作,儘量用GenericAPIView
-5個檢視擴充套件類(父類都是object)
    CreateModelMixin:create
    DestroyModelMixin:destory
    ListModelMixin
    RetrieveModelMixin
    UpdateModelMixin
-9個檢視子類(GenericAPIView+上面5個檢視擴充套件類中的一個或多個)
	RetrieveUpdateDestroyAPIView
    CreateAPIView
    RetrieveAPIView
    DestroyAPIView
    RetrieveUpdateAPIView
    ListCreateAPIView
    UpdateAPIView
    ListAPIView
    RetrieveDestroyAPIView
-檢視集
	-ModelViewSet:5大介面都有了
    -ReadOnlyModelViewSet:獲取一條和獲取多條的介面
	-GenericViewSet:ViewSetMixin+GenericAPIView        
    ViewSet:ViewSetMixin+APIView
    ViewSetMixin:類重寫了as_view,路由配置就變樣了

10 路由

-基本配置:跟之前一樣
-有action的:必須繼承ViewSetMixin
-自動生成:DefaultRouter和SimpleRouter
	-匯入,例項化得到物件,註冊多個,物件.urls(自動生成的路由)
    -路由相加urlpatterns+=router.urls/include:path('', include(router.urls))
-檢視類中自己定義的方法,如何自動生成路由
	-在自己定義的方法上加裝飾器(action)
    -兩個引數methods=[GET,POST],表示這兩種請求都能接受
    -兩個引數detail=True,表示生成帶pk的連線

11 三大認證

-認證元件:校驗使用者是否登入
	-寫一個認證類,繼承BaseAuthentication,重寫authenticate,內部寫認證邏輯,認證通過返回兩個值,第一個是user,認證失敗,拋去異常
    -全域性使用,區域性使用,區域性禁用
-許可權:校驗使用者是否有許可權進行後續操作
	-寫一個類,繼承BasePermission,重寫has_permission,True和False
    -全域性使用,區域性使用,區域性禁用
-頻率:限制使用者訪問頻次
	-寫一個類,繼承SimpleRateThrottle,重寫get_cache_key,返回什麼,就以誰做限制,scop=luffy欄位,需要跟setting中的key對應   luffy:3/h(一小時訪問三次)
    
    -全域性配置,區域性配置,區域性禁用
    -需求:傳送簡訊驗證碼的介面,一分鐘只能傳送一次,區域性使用,配在檢視類上

12 解析器:前端傳的編碼格式,能不能解析(預設三種全配了,基本不需要改),可能你寫了個上傳檔案介面,區域性配置一下,只能傳form-data格式 區域性使用:MultiPartParser

13 響應器:響應的資料,是json格式還是帶瀏覽器的那種(不需要配)

14 過濾器:藉助於第三方django-filter

-註冊應用
-setting中配置DjangoFilterBackend或者區域性配置
-filter_fields = ('age', 'sex')

15 排序

-全域性或者區域性配置rest_framework.filters.OrderingFilter
-檢視類中配置: ordering_fields = ('id', 'age')

16 分頁

-使用:
    繼承了APIView的檢視類中使用
    	 page=Mypage()
        # 在資料庫中獲取分頁的資料
        page_list=page.paginate_queryset(queryset物件,request,view=self)
        # 對分頁進行序列化
        ser=BookSerializer1(instance=page_list,many=True)
        # return Response(ser.data)
    繼承了檢視子類的檢視中使用
    	 pagination_class = PageNumberPagination(配置成自己重寫的,可以修改欄位)
-CursorPagination
    cursor_query_param:預設查詢欄位,不需要修改
    page_size:每頁數目
    ordering:按什麼排序,需要指定
-LimitOffsetPagination
	default_limit 預設限制,預設值與PAGE_SIZE設定一直
    limit_query_param limit引數名,預設’limit’
    offset_query_param offset引數名,預設’offset’
    max_limit 最大limit限制,預設None
-PageNumberPagination:最常用的,需要在setting中配置page_size,四個引數
    page_size 每頁數目
    page_query_param 前端傳送的頁數關鍵字名,預設為”page”
    page_size_query_param 前端傳送的每頁數目關鍵字名,預設為None
    max_page_size 前端最多能設定的每頁數量

17 全域性異常

-寫一個方法
	def exception_handler(exc, context):
        # 走drf原來的異常,原理異常有一些處理
        response = drf_exception_handler(exc, context)
		# 我們自己處理,drf沒有處理,丟給django的異常
        if response is None:
            if isinstance(exc, DatabaseError):#處理了一下資料庫錯誤
                response = Response({'detail': '資料庫錯誤'}, status=status.HTTP_507_INSUFFICIENT_STORAGE)
            else:#其他異常
                response = Response({'detail': '未知錯誤'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

return response
-配置檔案中配置(以後所有drf的異常,都會走到這裡)
	REST_FRAMEWORK = {
        'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'
    }

-18 jwt
-是什麼json web token 新的認證方式
-三段:頭,荷載(使用者資訊),簽名
-使用:最簡單方式(在路由中配置)
-path('login/', obtain_jwt_token),
-自定製:
多方式登入,手動簽發token(兩個方法)
-自定製基於jwt的認證類
-取出token
-呼叫jwt提供的解析出payload的方法(校驗是否過期,是否合法,如果合法,返回荷載資訊)
-轉成user物件
-返回

-19 RBAC:基於角色的許可權控制(django預設的auth就是給你做了這個事),公司內部許可權管理
對外的許可權管理就是用三大認證
-使用者表
-使用者組表
-許可權表
-使用者對使用者組中間表
-使用者組對許可權中間表
-使用者對許可權中間表