今日内容概要
- 排序和过滤源码分析
- 基于jwt的认证类
- RBAC的介绍和使用
- Casbin权限控制
- 后台管理simplui的介绍和使用
排序和过滤源码分析
- 继承了GenericAPIView+ListModelMixin,只要在视图类中配置filter_backends它就能实现过滤和排序。
drf内置的过滤类(SearchFilter),排序类(OrderingFiler)
django-filter
自定义:写一个类,继承BaseFilterBackend,重写filter_queryset,返回的qs对象,就是过滤或排序后的。
- 只有获取所有才涉及到排序
list方法:
def list(self, request, *args, **kwargs):
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):
print(request.META)
jwt_value=request.META.get