Django---子框架drf內容總結
阿新 • • 發佈:2020-07-16
目錄
- 1 restful規範--10條
- 2 django上寫符合restful規範的介面
- 3 drf寫介面
- 4 APIView--》繼承了原生View---》get,post方法
- 5 Request物件:request.request,request.data,重寫了__getattr_,request.method-->去原生request中拿
- 6 Response物件---》封裝了原生的HttpResponse,Response(data,headers={},status=1/2/3/4/5開頭的)
- 7 自己封裝了Response物件
- 8 序列化類:
- 9 檢視
- 10 路由
- 11 三大認證
- 12 解析器:前端傳的編碼格式,能不能解析(預設三種全配了,基本不需要改),可能你寫了個上傳檔案介面,區域性配置一下,只能傳form-data格式 區域性使用:MultiPartParser
- 13 響應器:響應的資料,是json格式還是帶瀏覽器的那種(不需要配)
- 14 過濾器:藉助於第三方django-filter
- 15 排序
- 16 分頁
- 17 全域性異常
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就是給你做了這個事),公司內部許可權管理
對外的許可權管理就是用三大認證
-使用者表
-使用者組表
-許可權表
-使用者對使用者組中間表
-使用者組對許可權中間表
-使用者對許可權中間表