安裝: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間的寶馬牌騎車
1.什麼是接口:url+請求參數+響應數據 | 接口文檔算法
2.接口規範:數據庫
url:https,api,資源(名詞複數),v1,get | post表示操做資源的方式,?過濾條件django
響應數據:status,msg,results | data, url資源數據json
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)爲不一樣的過濾類配置過濾條件