zoukankan      html  css  js  c++  java
  • DRF 部分拓展及缓存拓展

    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表
    

    xadmin

    Django中有内置的admin后台管理 但也有人开源提供了xadmin的有UI美化的后台管理

    安装步骤:

    -区分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)
    

    缓存粒度

    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)
    

    缓存拓展

    缓存雪崩:

    缓存雪崩是指数据未加载到缓存中,或者缓存同一时间大面积的失效,在某一时刻大量的缓存没有命中,从而导致所有的请求数据都去查数据库,倒是数据库瞬间CPU和内存负载过高,或者宕机。

    缓存穿透:

    当查询一个数据库不存在的数据而且缓存中也没有这个数据时,就会使得访问每次都会访问DB,如果有人存在恶意访问行为(发送高频率请求)就有可能对DB数据库造成影响。

    缓存失效:

    如果缓存集中在一段时间内失效,DB的压力凸显,DB负载急剧上升。这个没有完美解决办法,但可以分析用户行为,尽量让失效时间点均匀分布。

    缓存预热:

    系统部署时,防止用户一瞬间访问数据库,负载过大,由开发人员主动将数据加载到缓存中

    单机---系统:手动刷新页面既可以了,或者定时缓存缓存

    分布式系统: 分布式系统问题在于数据量非常大,缓存可能会导致数据库宕机!通过程序进行单个缓存加载!

  • 相关阅读:
    微信小程序 登录
    小程序验证码输入框 连续输入 自动跳到下一个input
    微信小程序支付方法
    判断屏幕是否过大 或国小 进行 缩放达到自适应
    reactnative 启动
    第二届中国云计算应用论坛圆满闭幕 北达软
    什么是EA? 北达软
    第二届中国云计算应用论坛2012.01.08北京大学隆重揭幕 北达软
    北达软主办的企业架构与数据规划培训圆满结束 北达软
    北达软主办的“第九期中国EA沙龙”圆满举行 北达软
  • 原文地址:https://www.cnblogs.com/x945669/p/13996161.html
Copyright © 2011-2022 走看看