缓存
缓存会在响应头中加一个字段:
Cache-Control: max-age=5
Expires 首部字段也可以用于告知缓存服务器该资源什么时候会过期。
在 HTTP/1.1 中,会优先处理 max-age 指令;
在 HTTP/1.0 中,max-age 指令会被忽略掉。
缓存方式有 5 种,包括:
- 开发调试
- 内存
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake',
}
}
- 文件
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '保存文件的位置',
}
}
- 数据库
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_cache_table', # 数据库表
}
}
之后执行创建表命令 python manage.py createcachetable
- memache 缓存(python-memcache 模块,pylibmc 模块)
其实也能配合 Reids,有人做了插件 django-redis
3 种应用: - 视图缓存
@cache_page(10) # 缓存 10 秒
def view(request):
pass
也可以在 url 种缓存
from django.views.decorators.cache import cache_page
urlpatterns = [
path('foo/<int:code>/', cache_page(60 * 15)(my_view)),
]
- 模板中使用缓存
{% load cache %}
以下是缓存的 html
{% cache 5 缓存key %} 5 秒
<h1></h1>
{% endcache %}
- 全站缓存
这里用到了中间件的知识
django.middleware.cache.UpdateCacheMiddleware --> 只有 process_response
xxx 其他中间件
django.middleware.cache.FetchFromCacheMiddleware --> 只有 process_request
信号
Django 包含一个“信号调度程序”,它有助于在框架中的其他位置发生操作时通知分离的应用程序。简而言之,信号允许某些发送者通知一组接收器已经发生了某些动作。当许多代码可能对同一事件感兴趣时,它们特别有用。
在用户注册后,保存密码到数据库中
# signals.py
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth import get_user_model
User = get_user_model()
@receiver(post_save, sender=User)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
password = instance.password
instance.set_password(password)
instance.save()
然后在 apps.py 中设置:
class UsersConfig(AppConfig):
def ready(self):
import users.signals
Django 信号分类
Django信号其实是观察者模式
- 与模型相关
pre_init
model 执行构造方法前
post_init
model 执行构造方法后
pre_save
django的model对象保存前,自动触发
post_save
django的model对象保存后,自动触发
pre_delete
django的model对象删除前,自动触发
post_delete
django的model对象删除后,自动触发
m2m_changed
django的model中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
class_prepared
程序启动时,检测已注册的app中model类,对于每一个类,自动触发 - 与 migrate 相关
pre_migrate
执行migrate命令前,自动触发
post_migrate
执行migrate命令后,自动触发 - 与请求相关
request_started
请求到来前,自动触发
request_finished
请求结束后,自动触发
got_request_exception
请求异常后,自动触发 - 与测试相关
setting_changed
使用test测试修改配置文件时,自动触发
template_rendered
使用test测试渲染模板时,自动触发 - 数据库相关
connection_created
创建数据库连接时,自动触发
另外一种方法激活信号,将代码放置于项目的根__init__.py
中
from django.db.backends.signals import pre_save
def callback(sender, *kwargs):
pass
pre_save.connect(callback,sender=<model 的名字>)
这里 model 的名字可以不指定
那么就意味着所有 model 保存时都会触发
另外还可以自定义信号,不过需要自己指定发送信号,详情见官方文档。
网友评论