接口
"""
一、什麼是接口: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)爲不一樣的過濾類配置過濾條件
"""