10.24總結

過濾器插件:django-filter

安裝:pip3 install django-filterhtml

過濾條件層:自定義api/filters.pyios

# django-filter插件過濾器類
from django_filters.rest_framework.filterset import FilterSet
from . import models

# 自定義過濾字段
from django_filters import filters
class CarFilterSet(FilterSet):
    min_price = filters.NumberFilter(field_name='price', lookup_expr='gte')
    max_price - filters.NumberFilter(field_name='price', lookup_expr='lte')
    class Meta:
        model = models.Car
        fields = ['brand', 'min_price', 'max_price']
        # brand是model中存在的字段,通常都是能夠用於分組的字段
        # min_price、max_price是自定義字段,須要本身自定義過濾條件

# 視圖層:views.py

# django-filter插件過濾器
from django_filters.rest_framework import DjangoFieldBackend
from .filters import CarFilterSet

class CarListAPIView(ListAPIView):
    queryset = models.Car.objects.all()
    serializer_class = serializers.CarModelSerializer

    # 局部配置 過濾類 們(全局配置用DEFAULT_FILTER_BACKENDS)
    filter_backends = [DjangoFilterBackend]

    # django-filter過濾器插件使用
    filter_class = CarFilterSet
    # 接口:?brand=...&min_price=...&max_price=...
    # eg:?brand=寶馬&min_price=5&max_price=10 => 5~10間的寶馬牌騎車

 

drf大總結

接口

1.什麼是接口:url+請求參數+響應數據 | 接口文檔算法

2.接口規範:數據庫

  url:https,api,資源(名詞複數),v1,get | post表示操做資源的方式,?過濾條件django

  響應數據:status,msg,results | data, url資源數據json

 

DRF入門

1.封裝風格axios

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

3.請求模塊:二次封裝request服務器

4.解析模塊:局部全局配置,form-data、urlencoding、json網絡

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

6.響應模塊:Response(data,http_status,header)

data={'detail': serializer_obj.errors} => http_status=4.. | 5..

# 4,5開頭字段狀態碼,前臺axios請求響應會解析到catch分支

axios({ }).then().catch()

7.二次封裝Response

  1.繼承Response

  2.自定義參數格式化成data,傳給 super().__init__(data=data)

  3.網絡狀態碼、響應頭等信息帶給super().__init__()

8.異常模塊:在請求生命週期中,分發請求任務執行時,被一個超大的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.CharField(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=True)

        # 返回序列化結果 user_ser.data
    def post(self, request, *args, **kwargs):
        # 數據給序列化類
        user_ser = UserModelSerializer(data=user_list, many=True)
        user_ser = UserModelSerializer(data=user_list, many=True)
        # 校驗數據
        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_list, 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)爲不一樣的過濾類配置過濾條件

相關文章
相關標籤/搜索