今日内容概要
- 排序和过滤源码分析
- 基于jwt的认证类
- RBAC的介绍和使用
- Casbin权限控制
- 后台管理simplui的介绍和使用
排序和过滤源码分析
- 继承了GenericAPIView+ListModelMixin,只要在视图类中配置filter_backends它就能实现过滤和排序。
drf内置的过滤类(SearchFilter),排序类(OrderingFiler)
django-filter
自定义:写一个类,继承BaseFilterBackend,重写filter_queryset,返回的qs对象,就是过滤或排序后的。- 只有获取所有才涉及到排序
list方法: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
- 总结:
(1)写的过滤类要重写filter_queryset,返回qs(过滤或排序后)对象;
(2)后期如果不写过滤类,只要在视图类中重写filter_queryset,在里面实现过滤也可以。
基于jwt的认证类
代码展示:
from rest_framework.authentication import BaseAuthentication import jwt from rest_framework.exceptions import AuthenticationFailed from rest_framework_jwt.authentication import JSONWebTokenAuthentication from rest_framework_jwt.settings import api_settings from .models import UserInfo jwt_decode_handler = api_settings.JWT_DECODE_HANDLER class JWTAuthication(BaseAuthentication): def authenticate(self, request): # 放到头中:token print(request.META) jwt_value=request