2020-12-14 drf-jwtRBAC,xadmin,缓存,信号

昨日回顾

1、基于jwt的多方式登录

-login
-之前写的处理逻辑都是在视图类中
-这次把逻辑拿到序列化类中validate方法中,在视图函数中不用写逻辑,执行了is_valide,就会把数据传到validate这进行校验,都通过后,就会返回到序列化对象的data中
-重点:视图类和序列化类之间交互数据的桥梁,context={},是在校验通过之后的交互才可以

2、自定义用户表,登录,手动签发token,自己定义的认证类

-认证哦通过,正常情况下查询得到当前登录用户(访问数据库),但是咱们处于效率的考虑没有查询数据,自己构造了一个user对象,就是在认证通过后,解析出payload荷载
直接讲荷载等于user,返回到视图类,就可以在request.user里取到字典,里面有user_id,根据这个就可以取到用户对象和具体字段信息。

3、jwt中重要的

-几个函数:
    -payload = jwt_decode_handler(token)  # 解码过程
    -payload = jwt_payload_handler(user)  # 加码的过程
    -token = jwt_encode_handler(payload)  # 通过payload得到
-token
    -配置文件:
        -token过期时间

4、book的多表增删查改,群增,群删,群查,群改

-群查,单查
-单增,群增:序列化类,初始化的时候,指定many=True,得到的是ListSerializer对象
-单扇,群删:合二为一
-单改,群改:
    群改两种方法:
        -自行for循环
        -many=True,重写ListBookSerializer,继承ListSerializer,重写update方法
指定many=True的时候,就生成ListBookSerializer的对象了
BookSerializer要跟ListBookSerializer建立联系
list_serializer_class=ListBookSerializer,这样群增的时候才会导到ListBookSerializer执行

今日内容

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

RBAC:是基于角色的访问控制(Role-Based Access Control)
在RBAC中,权限于角色相关联,用户通过成为适当角色的成员而得到这些角色的权限,这就极大的简化了权限的管理,这样管理都是层级相互依赖的,权限赋予给角色,
而把角色又赋予给用户,这样的权限设计很清楚,管理起来很方便。

# 后台管理(公司内部系统):使用RBAC,基于角色的访问控制,就是控制后台管理中的人员的权限设置
# 前台(主站)的权限管理:权限,频率,认证,来控制,用户所能看到的东西叫前台或者主站

# rbac的表设计
# 最初3张表
用户表  角色表  权限表

# 5张表
用户表  角色表  权限
用户表和角色表是多对多,需要建立第三张表
角色和权限是多对多,需要建立第三张表

#6张表
用户表  角色表 权限表
用户表和角色表是多对多,需要建立第三张表
角色和权限是多对多,需要建立第三张表
用户和权限多对多,建立第三张表

# django内置了rbac的6张表
auth_user:用户表
auth_group:角色(组)表
auth_permission:权限表
auth_user_group:用户对角色的中间表
auth_group_permission:角色对权限的中间表
auth_user_user_permission:用户地权限的中间表

# 结论:没有特殊要求的django项目可以直接采用auth组件的权限6表,不需要自定义六个表,也不需要断开表关系,但可能需要自定义user表

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、美化
    -在app中的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 控制显示图表的样式
            data_charts = {
                "order_amount": {
                    'title': '图书价格表',
                    "x-field": "id",
                    "y-field": ('price',),
                    "order": ('id',)
                },

            }
         -表注册,以及美化类注册
        xadmin.site.register(models.Book,BookClass)
        xadmin.site.register(models.Publish)
        xadmin.site.register(models.AuthorDetail)
        xadmin.site.register(models.Author)

3、django缓存

缓存介绍:

在动态网站中,用户所有请求,服务器都会去数据库进行相应的增删查改,渲染模板,执行业务逻辑,最后生成用户看到的页面。
当一个网站的用户访问量很大的时候,每一次的后台操作,都会消耗很多的服务端资源,所以必须是用缓存来减轻后端服务器的压力。
缓存时将一些常用的数据保存在内存或者memcache中,在一定的时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或者memcache的缓存
中去取得数据,然后返回给用户。

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中配置
    from django.middleware.cache import UpdateCacheMiddleware  # 可以这样导入来看源码, 这就是重写了process_response方法

    ‘django.middleware.cache.UpdateCacheMiddleware’, #第一,重写了process_response
    '............',
    ‘django.middleware.cache.FetchFromCacheMiddleware’, #最后,重写了process_requset
    # 缓存过期时间
    CACHE_MIDDLEWARE_SECONDS=5

3.3、前后端分离后缓存使用

-1、查出一堆json格式数据,连表查了8个表
-2、前后端分离后
    -只需要会如何把字典,字符串,对象放到缓存中,
    -如何取出来
-3、具体使用,代码如下
    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)# 参数分别是缓存的key,要缓存的数据,过期时间,注意不要和其他缓存想冲了,一般不同时使用。
                print('没走缓存')
                return Response(ser.data)
-4、cache可以缓存所有数据类型,包括自定义的类,用的就是pickle方法

4、django信号

信号简介

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、内置信号的使用(两种方式)
# 在app里的__init__.py中写代码
对于django内置的信号,仅需组测指定的信号,当程序执行相应操作时,自动触发注册函数执行
#方式一
    #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、信号的应用场景
    -记录日志(对象创建就写入日志)
    -解耦合

你可能感兴趣的:(2020-12-14 drf-jwtRBAC,xadmin,缓存,信号)