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