• drf——django的缓存和信号


    一、django缓存

    1.缓存位置

    缓存的地方:
    1 内存中
    2 文件中(硬盘上)
    3 数据库缓存(硬盘上)
    4 redis中(后期都用它,内存上,更快)
    
    5 通过配置,设置缓存位置
        -以文件缓存为例,在settings.py中配置
        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)
          }
         }   
    }

    2.缓存粒度

    #这里说的是前后端混合开发的缓存
    1 三种粒度:整站缓存,单页面缓存,局部缓存
    ps:时间越长级别越高,缓存就用级别高的
    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.前后端分离后缓存使用

    1 查出一堆json格式数据,链表查了8个表 
    2 前后端分离以后,
        -只需要会如何是把字典,字符串,对象放到缓存中,
        -如何取出来
    4 具体使用
    #models.py
    Book表并进行数据迁移
    #views.py----这个可以就是模板,哪里需要随便拿着用
    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)
    #serializer.py
    from  app01 import models
    from rest_framework import serializers
    class BookSer(serializers.ModelSerializer):
        class Meta:
            model=models.Book
            fields='__all__'
            
    #urls.py
    path('books/', views.BookView.as_view()),
    
    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 信号的应用场景:
            -记录日志(对象创建就写入日志)
            -解耦合
        
  • 相关阅读:
    group by与聚合函数
    表联结
    项目延期 怎样规避风险
    虚拟机安装linux系统
    Cannot truncate a table referenced in a foreign key constraint
    李航--《统计学习方法总结》
    CART算法
    北航学长分享交流笔记
    CentOS7导入MySql数据表结构并显示表结构
    RedHat7安装mysql5.7数据库
  • 原文地址:https://www.cnblogs.com/guojieying/p/14001795.html
Copyright © 2020-2023  润新知