07. Django REST framework - 分页,xadmin的使用,RBAC-基于角色的访问控制
分页Pagination
三种分页方式
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'
}
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/books/?page=3 # 查第3页
http://127.0.0.1:8000/books/?page=2&size=3 # 第2页显示3条
3、局部使用(视图类中)
pagination_class = CustomNumberPagination
4、全局使用,在settings.py 配置文件中(以后所有视图的查询所有方法都用这个分页)
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS':'app01.page.CustomNumberPagination'
}

1、在page.py 中自定义一个分页类,继承LimitOffsetPagination,并重写类属性
from rest_framework.pagination import LimitOffsetPagination
class CustomLimitOffsetPagtion(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 = CustomLimitOffsetPagtion
4、请求方式:(postman中测试)
http://127.0.0.1:8000/books/ # 默认从0开始取2条
http://127.0.0.1:8000/books/?limit=3&offset=2 # 取3条,从第2条开始
3、局部使用(视图类中)
pagination_class = CustomLimitOffsetPagtion
4、全局使用,在settings.py 配置文件中(以后所有视图的查询所有方法都用这个分页)
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS':'app01.page.CustomLimitOffsetPagtion'
}

1、在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/books/?cursor=cD0y # 按照cursor给的key值查找下一页
http://127.0.0.1:8000/books/?cursor=cj0xJnA9Mw%3D%3D # 按照cursor给的key值查找上一页
3、局部使用(视图类中)
pagination_class = CustomCursorPagination
4、全局使用,在settings.py 配置文件中(以后所有视图的查询所有方法都用这个分页)
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS':'app01.page.CustomCursorPagination'
}

class BookAPIView(APIView):
book_list = models.Book.objects.all().filter(is_delete=False)
page_cursor = MyPageNumberPagination()
book_list = page_cursor.paginate_queryset(book_list, request, view=self)
next_url = page_cursor.get_next_link()
pr_url = page_cursor.get_previous_link()
book_list_ser = ser.BookModelSerializer(book_list, many=True)
return APIResponse(data=book_list_ser.data, url={"next_url": next_url, "pr_url": pr_url})
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 - 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号