安装: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)为不一样的过滤类配置过滤条件