1、RBAC:基于角色的访问控制(Role-Based Access Control )
在 RBAC 中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便 # 后台管理中(公司内部系统):使用RBAC,基于角色的访问控制 # 前台(主站)的权限管理:权限,频率,认证 控制 # rbac的表设计 # 最初3张表 用户表 角色表 权限表 # 5张表 用户表 角色表 权限表 用户表和角色表是多对多,需要建立第三张表 角色和权限是多对多,需要建立第三张表 # 6 张表 用户表 角色表 权限表 用户表和角色表是多对多,需要建立第三张表 角色和权限是多对多,需要建立第三张表 用户和权限多对多,建立第三张表 # django内置了rbac的6张表 auth_user:用户表,扩写 auth_group:角色表(组表) auth_permission:权限表 auth_user_groups:用户对角色的中间表 auth_group_permissions:角色对权限的中间表 auth_user_user_permissions:用户对权限的中间表 # 公司内部项目,后台管理喜欢用django,内置了rbac6表
2、Xadmin的使用
1 django内置了一个admin,有的人觉得丑,功能不够强大,这群人写了一个叫xadmin的,用来替换admin 2 django的一个app 3 如何使用 -区分1.x和2.x -1.x :pip3 install xadmin -2.x :pip3 install git+git://github.com/sshwsfc/xadmin.git@django2 pip3 install https://codeload.github.com/sshwsfc/xadmin/zip/django2 -django2.x+xadmin 2.x 环境搭建 -安装 -在app中注册 'xadmin', 'crispy_forms', 'reversion', -修改国际化 # 修改使用中文界面 LANGUAGE_CODE = 'zh-Hans' # 修改时区 TIME_ZONE = 'Asia/Shanghai' -数据迁移 python3 manage.py makemigrations python3 manage.py migrate -配置路由信息 import xadmin xadmin.autodiscover() # version模块自动注册需要版本控制的 Model from xadmin.plugins import xversion xversion.register_models() urlpatterns = [ path('xadmin/', xadmin.site.urls) ] -创建超级用户 python manage.py createsuperuser -登录,访问地址,输入用户名密码进入 http://127.0.0.1:8000/xadmin/ 4 美化 -写一个类 class BookClass(): # 该表展示的字段 list_display = ['id', 'name', 'price','publish'] # 按照这些字段搜索 search_fields = ['id','name'] # 按哪些字段过滤 list_filter = ['is_delete'] # 可以把数据导出成excel,json,xml格式 list_export = ('xls', 'xml', 'json') # list_export设置为None来禁用数据导出功能 list_export_fields = ('id', 'name', 'price') data_charts = { "order_amount": { 'title': '随便写', "x-field": "price", "y-field": ('publish',), "order": ('id',) }, } -注册 xadmin.site.register(models.Book,BookClass)
3、django缓存
3.1 缓存位置
1 内存中 2 文件中(硬盘上) 3 数据库缓存 4 redis中(后期都用它) 5 通过配置,设置缓存位置 -以文件缓存为例 CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定缓存使用的引擎 'LOCATION': '/var/tmp/django_cache', #指定缓存的路径 'TIMEOUT':300, #缓存超时时间(默认为300秒,None表示永不过期) 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300) 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) } } }
3.2 缓存粒度
1 三种粒度:整站缓存,单页面缓存,局部缓存 2 单页面缓存 from django.views.decorators.cache import cache_page @cache_page(5) def index(request): import time ctime=time.time() return render(request,'index.html',context={'ctime':ctime}) 3 页面中某个位置缓存(局部缓存) # 缓存3s钟。xxx唯一key,唯一的 {% load cache %} {% cache 3 'xxx'%} 这一部分用缓存 时间为:{{ ctime }} {% endcache %} 4 整站缓存(两个中间件) # 在setting中配置 ‘django.middleware.cache.UpdateCacheMiddleware’, #第一,重写了process_response '。。。', ‘django.middleware.cache.FetchFromCacheMiddleware’, #最后,重写了process_requset # 缓存过期时间 CACHE_MIDDLEWARE_SECONDS=5
3.3 前后端分离缓存使用
1 查出一堆json格式数据,链表查了8个表 2 前后端分离以后, -只需要会如何是把字典,字符串,对象放到缓存中, -如何取出来 4 具体使用 from django.core.cache import cache class BookView(APIView): def get(self, request): res_data = cache.get('book_list_dix',) if res_data: # 有缓存,直接返回 print('走了缓存') return Response(res_data) else: # 没有缓存,再走数据库 book_list = models.Book.objects.all() ser = serializer.BookSer(book_list, many=True) # 想把ser.data缓存起来 cache.set('book_list_dix', ser.data,100) print('没走缓存') return Response(ser.data) 5 cache可以缓存所有数据类型,包括自定义的类(pickle)
4、django信号
1 Django提供一种信号机制。当发生一些动作的时候,发出信号,然后监听了这个信号的函数就会执行 2 Django内置信号 Model signals pre_init # django的modal执行其构造方法前,自动触发 post_init # django的modal执行其构造方法后,自动触发 pre_save # django的modal对象保存前,自动触发 post_save # django的modal对象保存后,自动触发 pre_delete # django的modal对象删除前,自动触发 post_delete # django的modal对象删除后,自动触发 m2m_changed # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发 class_prepared # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发 Management signals pre_migrate # 执行migrate命令前,自动触发 post_migrate # 执行migrate命令后,自动触发 Request/response signals request_started # 请求到来前,自动触发 request_finished # 请求结束后,自动触发 got_request_exception # 请求异常后,自动触发 Test signals setting_changed # 使用test测试修改配置文件时,自动触发 template_rendered # 使用test测试渲染模板时,自动触发 Database Wrappers connection_created # 创建数据库连接时,自动触发 3 内置信号的使用(两种方式) # #1 导入内置信号 # from django.core.signals import request_started # #2 写一个函数 # def aa(sender, **kwargs): # print(sender) # print(kwargs) # print('请求来了,我写日志了。。。') # # # #3 跟内置信号绑定 # request_started.connect(aa) # 方式二 from django.core.signals import request_started,request_finished from django.dispatch import receiver @receiver(request_finished) # 内置信号pre_save和my_callback函数绑定了 def my_callback(sender, **kwargs): print("请zzou了,走了我") 4 信号的应用场景: -记录日志(对象创建就写入日志) -解耦合