zoukankan      html  css  js  c++  java
  • RBAC、xadmin、django缓存、django信号等相关内容-91

    1 RBAC-基于角色的访问控制

    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 信号的应用场景:
    -记录日志(对象创建就写入日志)
      -解耦合
        
  • 相关阅读:
    笔记本
    物料主档建立(PP模组)
    烦!烦!烦!
    Windows Live Writer试用
    SAP系统中发送公告的几种办法
    [CSS样式表之] 渐变色的实现
    今天终于开通了这个博客了
    MFC消息映射机制过程
    绘图
    C++ 内存分配和指针
  • 原文地址:https://www.cnblogs.com/usherwang/p/14329718.html
Copyright © 2011-2022 走看看