目录
过滤源码分析
1、过滤源码分析
1.内置过滤类:
1.1 过滤--针对查询所有--视图类继承GenericAPIView+ListModelMixin
1.2 在视图类中配置:filter_backends=[SearchFilter, ] # SearchFilter过滤类
search_fields=[过滤字段]
1.3 ListModelMixin重写了list方法--找到GenericAPIView的filter_queryset方法
从filter_backends获取过滤字段通过for循环进行过滤 最后将过滤后的字段返回
def filter_queryset(self, queryset):
for backend in list(self.filter_backends):
queryset = backend().filter_queryset(self.request, queryset, self)
return queryset
1.4 SearchFilter通过filter_queryset方法从视图类中拿到search_fields的过滤字段
def filter_queryset(self, request, queryset, view):
search_fields = self.get_search_fields(view, request)
search_terms = self.get_search_terms(request)
return queryset
2.自定义过滤类
写一个类继承BaseFilterBackend---重写filter_queryset方法
获取字段进行数据筛选之后将数据返回
排序源码分析
2.排序源码分析
1.内置排序类:
1.1 排序--针对查询所有--视图类继承GenericAPIView+ListModelMixin
1.2 在视图类中配置:filter_backends=[OrderingFilter, ] # SearchFilter过滤类
ordering_fields=[筛选字段,]
1.3 ListModelMixin重写了list方法--找到GenericAPIView的filter_queryset方法
从filter_backends获取过滤字段通过for循环进行过滤 最后将过滤后的字段返回
def filter_queryset(self, queryset):
for backend in list(self.filter_backends):
queryset = backend().filter_queryset(self.request, queryset, self)
return queryset
1.4 OrderingFilter通过filter_queryset方法从视图类中拿到ordering_fields的过滤字段
排序后将数据返回
def filter_queryset(self, request, queryset, view):
ordering = self.get_ordering(request, queryset, view)
if ordering:
return queryset.order_by(*ordering)
return queryset
2.自定义排序类
写一个类继承BaseFilterBackend---重写filter_queryset方法
获取字段进行数据排序之后将数据返回
注:过滤与排序可以互相配合
基于jwt的认证类
1.写一个认证类--继承BaseAuthentication
2.获取token值 进行解码 判断返回数据
3.视图类配置
认证类:
class UserAuthentication(BaseAuthentication):
def authenticate(self, request):
jwt_value = request.META.get('HTTP_TOKEN')
if jwt_value is None:
return None
try:
payload = jwt_decode_handler(jwt_value)
except ExpiredSignature:
raise exceptions.AuthenticationFailed('token过期')
except DecodeError:
raise exceptions.AuthenticationFailed('解码错误')
except InvalidTokenError:
raise exceptions.AuthenticationFailed('其他错误')
user_id = payload.get('user_id')
return (user_id, jwt_value)
视图类:
class BookView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializers
authentication_classes = [UserAuthentication, ]
RBAC、ALC、ABAC(PBAC、CBAC)权限控制
一、RBAC--Role-Based Access Control---基于角色的访问控制
权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便
1.django的RBAC---适用于公司内部的管理系统---使用它不用写权限
1.1 涉及表
用户:用户表
角色(部门):角色表
权限:权限表
1.2 表关系
用户--角色--多对多
角色--权限--多对多
用户--角色--多对多
1.3 表---6张表---通过auth表迁移自动生成(makemigrations/migrate)
用户表---auth_user
角色表---auth_group
权限表---auth_permission
用户角色多对多关联表---auth_user_groups
角色权限多对多关联表---auth_group_permissions
用户权限多对多关联表---auth_user_user_permission
2.普通RBAC---适用于公司内部的管理系统
1.1 涉及表
用户:用户表
角色(部门):角色表
权限:权限表
1.2 表关系
用户--角色--多对多
角色--权限--多对多
1.3 表---5张表
用户表
角色表
权限表
用户角色多对多关联表
角色权限多对多关联表
二、ACL---Access Control List---访问控制列表--使用与互联网系统
将用户或组等使用者直接与对象的权限对接
用户表、权限表、中间表--给用户授予某些权力
三、ABAC---Attribute-Based Access Control---基于属性的访问控制
又称为PBAC---Policy-Based Access Control---基于策略的访问控制
又称为CBAC---Claims-Based Access Control---基于声明的访问控制
四、架构:
1. 传统ACL与RBAC的架构:{subject,action,object},
2. ABAC架构:{subject,action,object,contextual}+parameter(参数)
subject属性:比如用户的年龄、部门、角色、威望、积分等主题属性。
action属性:比如查看、读取、编辑、删除等行为属性。
object属性:比如银行账户、文章、评论等对象或资源属性。
contextual属性:比如时段、IP位置、天气等环境属性。
注:公司用的较多的是:RBAC+ACL=django的RBAC
快速做权限控制---casbin
1.casbin模型:又称PERM模型
配置文件:model.conf
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
配置文件:policy
p,lili,book,read
p,bob,data2,write
操作:
import casbin
e = casbin.Enforcer("./model.conf", "./policy.csv")
sub = "lili" # 想要访问资源的用户
obj = "book" # 将要被访问的资源
act = "read" # 用户对资源进行的操作
if e.enforce(sub, obj, act):
# 允许alice读取data1
print('有权限')
else:
# 拒绝请求,抛出异常
print('没有权限')
后台管理-simplui的介绍和使用
1.下载:pip3 install django-simpleui
2.创建超级管理员:createsuperuser
3.admin中注册:
admin.site.register(User)
@admin.register(Publish)
class EmployeAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'address')
admin.site.register(Publish)
4.配置文件中配置
import time
SIMPLEUI_CONFIG = {
'system_keep': False,
'menu_display': ['首页', '图书管理系统], # 开启排序和过滤功能, 不填此字段为默认排序和全部显示, 空列表[] 为全部不显示.
'dynamic': True, # 设置是否开启动态菜单, 默认为False. 如果开启, 则会在每次用户登陆时动态展示菜单内容
'menus': [{
'name': '首页',
'icon': 'fas fa-code',
'url': '/index/',
# 浏览器新标签中打开
'newTab': True,
},
{
'app': 'app01',
'name': '图书管理系统',
'icon': 'fas fa-user-shield',
'models': [
{
'name': '用户',
'icon': 'fa fa-user',
'url': 'app01/user/'
},
{
'name': '图书',
'icon': 'fa fa-user',
'url': 'app01/book/'
},
{
'name': '出版社',
'icon': 'fa fa-user',
'url': 'app01/publish/'
}]},}]
标签:11,filter,--,self,queryset,---,权限,drf
From: https://www.cnblogs.com/040714zq/p/16789462.html