目录标题
一:排序和过滤源码分析
1.继承了GenericAPIView+ListModelMixin,只要在视图类中配置filter_backends它就能实现过滤和排序
# drf内置的过滤类(SearchFilter),排序类(OrderingFilter)
2.django-filter的使用
自定义:写一个类,继承BaseFilterBackend, 重写filter_queryset,返回qs对象,就是过滤或排序后的结果
3.只有获取多条数据,才涉及到排序
def list(self, request, *args, **kwargs):
# self.get_queryset()所有数据,经过了self.filter_queryset返回了qs
# self.filter_queryset完成的过滤
queryset = self.filter_queryset(self.get_queryset())
# 如果有分页,走的分页----》视图类中配置了分页类
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
# 如果没有分页,走正常的序列化,返回
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
self.filter_queryset完成了过滤,当前在视图类中,self是视图类的对象,去视图类中找没找到,去父类---》GenericAPIView---》filter_queryset
def filter_queryset(self, queryset):
for backend in list(self.filter_backends):
queryset = backend().filter_queryset(self.request, queryset, self)
return queryset
4.总结:
# 1.写的过滤类要重写filter_queryset,返回qs(过滤或排序后)对象
# 2.后期如果不写过滤类,只要在视图类中重写filter_queryset,在里面实现过滤也可以
二:基于jwt的认证类
class JWTAuthentication(BaseAuthentication):
def authenticate(self, request):
# 放到头中:token-->HTTP_TOKEN Authorization--->HTTP_AUTHORIZATION
print(request.META)
jwt_value = request.META.get('HTTP_TOKEN')
# 验证token是否合法,jwt模块下一定有个验证token的函数
try:
payload = jwt_decode_handler(jwt_value)
except jwt.ExpiredSignature:
raise AuthenticationFailed('token过期了')
except jwt.DecodeError:
raise AuthenticationFailed('token解码失败')