drf——django的缓存和信号 - Go语言中文社区

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 信号的应用场景:
        -记录日志(对象创建就写入日志)
        -解耦合
    

 

版权声明:本文来源博客园,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://www.cnblogs.com/guojieying/p/14001795.html
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-15 20:14:31
  • 阅读 ( 856 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢