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