zoukankan      html  css  js  c++  java
  • django使用之xadmin与RBAC,django缓存,django信号

    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 信号的应用场景:
            -记录日志(对象创建就写入日志)
            -解耦合
  • 相关阅读:
    Guzz入门教程
    设计模式开题
    纪录idea不能创建class类问题(Cannot Create Class)
    dbrouter实现流程图
    记录一次concurrent mode failure问题排查过程以及解决思路
    程序员的自我修养
    CyclicBarrier之共享锁的理解
    sed选项详解(options)
    sed 范围查找
    Sed命令
  • 原文地址:https://www.cnblogs.com/akakk/p/13995805.html
Copyright © 2011-2022 走看看