zoukankan      html  css  js  c++  java
  • drf之九 RBAC-基于角色的访问控制 xadmin的使用 Django缓存 Django信号

    RBAC-基于角色的访问控制   xadmin的使用  Django缓存   Django信号

    RBAC基于角色的访问控制

    RBAC :是基于角色的访问控制(Role-Based Access Control )
    在 RBAC  中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便
    0.
    # 前台(主站)的权限管理:权限,频率,认证 控制
    
    # 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表

    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 美化 在admin.py中
    import xadmin
    from xadmin import views
    from app01 import models
    class BaseSetting():
        """xadmin的基本配置"""
        enable_themes = True  # 开启主题切换功能
        use_bootswatch = True
    
    class GlobalSettings():
        """xadmin的全局配置"""
        site_title = "路飞学城"  # 设置站点标题
        site_footer = "路飞学城有限公司"  # 设置站点的页脚
        # menu_style = "accordion"  # 设置菜单折叠
    
    xadmin.site.register(views.BaseAdminView, BaseSetting)
    xadmin.site.register(views.CommAdminView, GlobalSettings)
    
    
        -写一个类
        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,y轴中最好写入数字才能显示出来
    "x-field": "price", "y-field": ('id',), "order": ('id',) }, } -注册想显示几个表就注册几个表 xadmin.site.register(models.Book,BookClass)

    Django缓存

    缓存位置

    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)
          }
         }   
    }
        

    缓存粒度

    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

    前后端分离后缓存使用

    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)

    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 信号的应用场景:
            -记录日志(对象创建就写入日志)
            -解耦合
  • 相关阅读:
    November 07th, 2017 Week 45th Tuesday
    November 06th, 2017 Week 45th Monday
    November 05th, 2017 Week 45th Sunday
    November 04th, 2017 Week 44th Saturday
    November 03rd, 2017 Week 44th Friday
    Asp.net core 学习笔记 ( Area and Feature folder structure 文件结构 )
    图片方向 image orientation Exif
    Asp.net core 学习笔记 ( Router 路由 )
    Asp.net core 学习笔记 ( Configuration 配置 )
    qrcode render 二维码扫描读取
  • 原文地址:https://www.cnblogs.com/ltyc/p/13996432.html
Copyright © 2011-2022 走看看