Django 缓存与信号

缓存

缓存会在响应头中加一个字段:
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//', cache_page(60 * 15)(my_view)),
]
  • 模板中使用缓存
{% load cache %}
以下是缓存的 html
{% cache 5 缓存key %}  5 秒
    

{% 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 保存时都会触发

另外还可以自定义信号,不过需要自己指定发送信号,详情见官方文档。

你可能感兴趣的:(Django 缓存与信号)