Django REST framework-分页、xadmin的使用、RBAC-基于角色的访问控制
分页Pagination
REST framework提供了分页的支持。可选分页器有三种
三种分页方式
1 三种分页方式
-基本分页:PageNumberPagination
page_size = 2 # 每页显示两条
page_query_param = 'page' # 查询第几页的参数 ?page=3
max_page_size = 4 # 每页最大显示多少条
page_size_query_param = 'size' #每页显示的条数查询条件(默认是page_size显示的条数) # ?page=3&size=3
-偏移分页:LimitOffsetPagination
default_limit=2 # 默认显示几条
limit_query_param='limit' # ?limit=3 表示取3条
offset_query_param = 'offset' # 偏移 ?offset=5&limit=3 # 从第5个位置开始,取3条数据
max_limit = 5 # 最多显示5条
-游标分页:CursorPagination
cursor_query_param = 'cursor' # 查询的key值
page_size = 2 # # 每页显示两条
ordering = 'id' # 按id字段排序
2 如何使用
- APP下创建一个自定义py文件,eg:page.py
- 在文件中写一个自定义分页类,继承三个之一,并重写类属性
- 在视图类中配置
class BookView(ViewSetMixin,ListAPIView,CreateAPIView):
queryset = models.Book.objects.all()
serializer_class = serializer.BookModelSerializer
# 配置使用的分页类
pagination_class = CustomNumberPagination
- 局部使用
pagination_class = CustomNumberPagination
- 全局使用,在配置文件中(以后所有视图的查询所有方法都用这个分页)
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS':'app01.page.CustomNumberPagination'
}
基本分页:PageNumberPagination
用的最多的一种
1、在page.py 中自定义一个类,继承PageNumberPagination,并重写类属性
from rest_framework.pagination import PageNumberPagination
class CustomNumberPagination(PageNumberPagination):
page_size = 2 # 每页显示两条
page_query_param = 'page' # 查询第几页的参数 ?page=3
max_page_size = 4 # 每页最大显示多少条
page_size_query_param = 'size' # 每页显示的条数查询条件(默认是page_size显示的条数) # ?page=2&size=3
2、在views.py 视图类中配置
from rest_framework.generics import ListAPIView, CreateAPIView
from rest_framework.viewsets import ViewSetMixin
from app01.page import CustomNumberPagination # 导入自定义分页类
class BookView(ViewSetMixin,ListAPIView,CreateAPIView):
queryset = models.Book.objects.all()
serializer_class = serializer.BookModelSerializer
# 配置使用的分页类
pagination_class = CustomNumberPagination
4、请求方式:(postman中测试)
http://127.0.0.1:8000/book/?page=3 # 查第3页
http://127.0.0.1:8000/book/?page=2&size=3 # 第2页显示3条
3、局部使用(视图类中)
pagination_class = CustomNumberPagination
4、全局使用,在settings.py 配置文件中(以后所有视图的查询所有方法都用这个分页)
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS':'app01.page.CustomNumberPagination'
}
-在APIview中使用方法:
-1 导入PageNumberPagination类
-2 实例化产生一个对象
-page_pagination = PageNumberPagination()
-3 需要配置四个参数:page_size,page_query_param,page_size_query_param,max_page_size
-page_size必须指定:在setting中指定或者直接赋值
-4 调用下面的方法,返回ret数据
ret = page_pagination.paginate_queryset(book_list, request, self)
-5 再序列化,就是序列化返回的数据,也就是ret

偏移分页: LimitOffsetPagination
用的比较少的一种
1、在page.py 中自定义一个分页类,继承LimitOffsetPagination,并重写类属性
from rest_framework.pagination import LimitOffsetPagination
class CustomLimitOffsetPagination(LimitOffsetPagination):
default_limit=2 # 默认显示几条
limit_query_param='limit' # ?limit=3 表示取3条
offset_query_param = 'offset' # 偏移 ?offset=5&limit=3 # 从第5个位置开始,取3条数据
max_limit = 5 # 最多显示5条
2、在views.py 视图类中配置
from rest_framework.generics import ListAPIView, CreateAPIView
from rest_framework.viewsets import ViewSetMixin
from app01.page import CustomLimitOffsetPagtion # 导入自定义偏移分页类
class BookView(ViewSetMixin,ListAPIView,CreateAPIView):
queryset = models.Book.objects.all()
serializer_class = serializer.BookModelSerializer
# 配置使用的分页类
pagination_class = CustomLimitOffsetPagination
4、请求方式:(postman中测试)
http://127.0.0.1:8000/book/ # 默认从0开始取2条
http://127.0.0.1:8000/book/?limit=3&offset=2 # 取3条,从第2条开始
3、局部使用(视图类中)
pagination_class = CustomLimitOffsetPagtion
4、全局使用,在settings.py 配置文件中(以后所有视图的查询所有方法都用这个分页)
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS':'app01.page.CustomLimitOffsetPagtion'
}
-在APIview中使用方法:
-1 导入LimitOffsetPagination类
-2 实例化产生一个对象
-page_pagination = LimitOffsetPagination()
-3 需要配置四个参数:default_limit,limit_query_param,offset_query_param,max_limit
-default_limit必须指定:在setting中指定或者直接赋值
-4 调用下面的方法,返回ret数据
ret = page_pagination.paginate_queryset(book_list, request, self)
-5 再序列化,就是序列化返回的数据,也就是ret

游标分页: CursorPagination
基本不用,但针对千万级别的数据,为了降低数据库的压力,建议使用这种
、在page.py 中自定义一个分页类,继承CursorPagination,并重写类属性
from rest_framework.pagination import CursorPagination
class CustomCursorPagination(CursorPagination): # 查询速度最快
cursor_query_param = 'cursor' # 查询的key值
page_size = 2 # # 每页显示两条
ordering = 'id' # 按id字段排序
# 下面两个基本不用无需配置
# page_size_query_param = None
# max_page_size = None
2、在views.py 视图类中配置
from rest_framework.generics import ListAPIView, CreateAPIView
from rest_framework.viewsets import ViewSetMixin
from app01.page import CustomCursorPagination # 导入自定义游标分页类
class BookView(ViewSetMixin,ListAPIView,CreateAPIView):
queryset = models.Book.objects.all()
serializer_class = serializer.BookModelSerializer
# 配置使用的分页类
pagination_class = CustomCursorPagination
4、请求方式:(postman中测试)
http://127.0.0.1:8000/book/?cursor=cD0y # 按照cursor给的key值查找下一页
http://127.0.0.1:8000/book/?cursor=cj0xJnA9Mw%3D%3D # 按照cursor给的key值查找上一页
3、局部使用(视图类中)
pagination_class = CustomCursorPagination
4、全局使用,在settings.py 配置文件中(以后所有视图的查询所有方法都用这个分页)
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS':'app01.page.CustomCursorPagination'
}
在APIview中使用方法


xadmin的使用
1 django后台管理admin
2 xadmin,美化页面,bootstrap+jq,
-django:1.x,2.x
-3.x以后就不用了
3 simple-ui
3.x用
4 django是1.x
pip3 install xadmin
5 django是2.x
pip install git+git://github.com/sshwsfc/xadmin.git@django2
6 碰到一个第三方插件,有些bug
-pip3 install 名字:装到解释器中---》下次换了别的解释器,改了源码,又得重新改
-把第三方插件的源码拿出来
-放到自己项目里,想怎么改,就怎么改
7 Xadmin和django的xadmin压根没有联系
-http://x.xuebingsi.com/
-纯前端(html,css,js)后台模板
-跟语言无关
-xadmin和layui的区别
基于layui写的后台管理模板
8 基于bootstrap的后台管理模板
-admin lte
9 前后端分离
-后台模板
-vue-admin
RBAC-基于角色的访问控制
RBAC 是基于角色的访问控制(Role-Based Access Control )
在 RBAC 中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便。
应用
RBAC - Role-Based Access Control
Django的 Auth组件 采用的认证规则就是RBAC
- 1)像专门做人员权限管理的系统(CRM系统)都是公司内部使用,所以数据量都在10w一下,一般效率要求也不是很高
- 2)用户量极大的常规项目,会分两种用户:前台用户(三大认证) 和 后台用户(BRAC来管理)
结论:没有特殊要求的Django项目可以直接采用Auth组件的权限六表,不需要自定义六个表,也不需要断开表关系,单可能需要自定义User表
前后台权限控制
- 1)后台用户对各表操作,是后台项目完成的,我们可以直接借助admin后台项目(Django自带的)
- 2)后期也可以用xadmin框架来做后台用户权限管理
- 3)前台用户的权限管理如何处理
- 定义了一堆数据接口的视图类,不同的登录用户是否能访问这些视图类,能就代表有权限,不能就代表无权限
- 前台用户权限用drf框架的 三大认证
Django的内置RBAC(六表)
1 权限3个表
- 用户表:auth_user
- 角色表:auth_group
- 权限表:auth_permission
2 权限6个表(正常是5个表),django的auth,用的就是6表
- 用户表:auth_user
- 角色表:auth_group
- 权限表:auth_permission
- 角色和权限是多对多:auth_group_permissions (G_P关系表)
- 用户和角色是多对多:auth_user_groups (U_G关系表)
- 用户和权限的多对多表:auth_user_user_permissions (U_P关系表)

浙公网安备 33010602011771号