drf 大總結

接口

"""
一、什麼是接口:url+請求參數+響應數據 | 接口文檔

二、接口規範:
    url:https,api,資源(名詞複數),v1,get|post表示操做資源的方式,?過濾條件
    響應數據:status,msg,results|data,url資源數據
"""

DRF入門

"""
一、封裝風格

二、請求生命週期:走APIView的as_view => View的as_view調用APIView的dispatch => 分發給視圖類的請求函數 => 響應

三、請求模塊:二次封裝request

四、解析模塊:局部全局配置,form-data、urlencoding、json

五、渲染模塊:局部全局配置,html、json

六、響應模塊:Response(data, http_status, header)
data={'detail': serializer_obj.errors} => http_status=4..|5..
# 4,5開頭字段狀態碼,前臺axios請求響應會解析到catch分支
axios({}).then().catch()

七、二次封裝Response:
    i) 繼承Response
    ii) 自定義參數格式化成data,傳給 super().__init__(data=data)
    iii) 網絡狀態碼、響應頭等信息帶給super().__init__()
    
八、異常模塊:在請求生命週期中,分發請求任務執行時,被一個超大的try except包裹,一旦出現任何異常,都會交給exception_handler函數處理
    自定義緣由:系統只處理了部分,因此手動還須要處理;後期異常信息須要記錄到日誌文件
    工做流程:先交給drf處理異常,若是有響應結果,表明drf已處理,若是是None,本身處理
"""

序列化組件

# 1)能夠將model對象序列化成能夠返回給前臺的json數據
# 2)能夠校驗前臺傳來的數據,完成model的增與改
模型層
class User(models.Model):
    name = models.CharField(max_length=16)
    
    # 自定義插拔序列化字段 - 完成連表深度查詢
    @property
    def my_name(self):
        return self.name
序列化層
class UserListSerializer(serializers.ListSerializer):
    def update(self, instance, validated_data):
        for index, obj in enumerate(instance):
            self.child.update(obj, validated_data[index])
        return instance

class UserModelSerializer(serializers.ModelSerializer):
    # 自定義反序列化不入庫字段 - 要在鉤子函數校驗後移除
    check_name = serializers.CharFiled(write_only=True)
    class Meta:
        model = User
        fields = ['name', 'my_name', 'check_name']
        extra_kwargs = {
            'my_name': {
                'read_only': True
            }
        }
        # 羣改
        list_serializer_class = UserListSerializer
    # 局部、全局鉤子
    # create、update方法不須要重寫,能夠完成單增、羣增、單改
視圖層
class UserAPIView(APIView):
    def get(self, request, *args, **kwargs):
        # 先orm獲得 user_query | user_obj
        
        # 在獲得序列化對象
        user_ser = UserModelSerializer(user_query, many=True)
        user_ser = UserModelSerializer(user_query, many=False)
        
        # 返回序列化結果 user_ser.data
    def post(self, request, *args, **kwargs):
        # 數據給序列化類
        user_ser = UserModelSerializer(data=user_list, many=True)
        user_ser = UserModelSerializer(data=user_dic, many=False)
        # 校驗數據
        user_ser.is_valid(raise_exception=True)
        # 數據庫操做
        user_query|user_obj = user_ser.save()
        
    def patch(self, request, *args, **kwargs):
        # 根據主鍵或主鍵們肯定要修改的 對象 或 對象們
        
        # 數據給序列化類
        user_ser = UserModelSerializer(data=user_list, many=True, instance=對象們, partial=True|False)
        user_ser = UserModelSerializer(data=user_dic, many=False, instance=對象, partial=True|False)
        # 校驗數據
        user_ser.is_valid(raise_exception=True)
        # 數據庫操做
        user_query|user_obj = user_ser.save()

三大認證

"""
一、認證組件:
    i)自定義認證類繼承BaseAuthentication,重寫authenticate方法
    ii)規則:遊客返回None,非法用戶拋異常,合法用戶返回(user, auth)
    iii)全局局部配置
    
二、權限組件:
    i)自定義權限類繼承BasePermission,重寫has_permission方法
    ii)規則:有權限返回True,無權限返回False - 校驗對象:request.user或請求方式
    iii)全局局部配置
    
三、評論組件:
    i)自定義頻率類繼承SimpleRateThrottle,重寫get_cache_key方法,設置scope類屬性
    ii)全局配置scope對應的訪問頻率:次數/時間
    iii)get_cache_key返回的是與限制條件有關的動態字符串 - 限制條件來源於請求參數或請求頭
    iv)全局局部配置
    
四、jwt認證:
    i)客戶端存token,服務器存簽發算法、校驗算法、祕鑰
    ii)基本信息(頭base64).用戶信息過時時間(載荷base64).全信息+祕鑰(簽名HS256)
    iii)drf-jwt組件使用
    iv)登陸接口簽發token
    v)認證組件校驗token
"""

羣查過濾組件

"""
一、搜索組件:search_fields = ['name', 'price']

二、排序組件:ordering_fields = ['pk', 'price']

三、分頁組件:pagination_class = pagenations.MyPageNumberPagination

四、django-filter過濾插件:filter_class = CarFilterSet

五、自定義過濾器:自定義過濾類實現filter_queryset便可,根據篩選條件篩選後再返回queryset便可

使用:
i)視圖類添加過濾類:filter_backends = [SearchFilter, OrderingFilter, LimitFilter, DjangoFilterBackend]
ii)爲不一樣的過濾類配置過濾條件
"""
相關文章
相關標籤/搜索