zoukankan      html  css  js  c++  java
  • drf10

    昨日回顾

    1 基于jwt的多方式登录
    	-login
    	-之前写的处理逻辑都是在视图类中
        -这次把逻辑拿到序列化类中validate方法中,在视图函数中不用写逻辑,is_valide
        -重点:视图类和序列化类之间交互数据的桥梁 context={}
    2 自己定义用户表,登录手动签发token,自己定义的认证类
    	-认证通过,正常情况下查询得到当前登录用户(访问数据库),但是咱们出于效率的考虑没有查询数据,自己构造了一个User对象
    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循环
                -重写ListBookSerializer,重写update方法,BookSerializer要跟ListBookSerializer建立联系,list_serializer_class=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_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 信号的应用场景:
    		-记录日志(对象创建就写入日志)
        	-解耦合
  • 相关阅读:
    POJ NOI MATH-7650 不定方程求解
    POJ NOI MATH-7656 李白的酒
    POJ NOI MATH-7654 等差数列末项计算
    POJ NOI MATH-7827 质数的和与积
    POJ NOI MATH-7830 求小数的某一位
    POJ NOI MATH-7833 幂的末尾
    POJ NOI MATH-7829 神奇序列求和
    POJ NOI MATH-7826 分苹果
    UVALive5661 UVA668 ZOJ2037 Parliament
    POJ1032 Parliament
  • 原文地址:https://www.cnblogs.com/feiguoguobokeyuan/p/14044125.html
Copyright © 2011-2022 走看看