django 信号和缓存使用

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          # 创建数据库连接时,自动触发

实现: (以下代码添加到project的__init__.py文件中)

from django.db.models.signals import pre_save
def callback(sender, **kwargs):
    print("xxoo_callback")
    print(sender, kwargs)
pre_save.connect(callback)

django 缓存

由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回。

Django中提供了6种缓存方式:

  • 开发调试
  • 内存
  • 文件
  • 数据库
  • Memcache缓存(python-memcached模块)
  • Memcache缓存(pylibmc模块)

配置:

  1开发调试

  2内存

  3文件

  4数据库

  5缓存数据库redis等

配置实例:

 在settings.py中设置

CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
                'LOCATION': '/var/tmp/django_cache',
            }
        }

应用:

  1全栈缓存(基于中间件实现)

  2视图函数缓存(基于装饰器实现)

  3模板局部缓存

应用实例:

a. 写中间件
    MIDDLEWARE = [
        # 'django.middleware.cache.UpdateCacheMiddleware',  # 打开此注释使用缓存
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        # 'django.middleware.cache.FetchFromCacheMiddleware',# 打开此注释使用缓存
    ]
b. 装饰器
    from django.shortcuts import render,HttpResponse
    from app01 import models
    from django.views.decorators.cache import cache_page
    import time
    @cache_page(60 * 15)
    def users(request):
        ctime = str(time.time())
        return HttpResponse(ctime)

c. 模板
    {% load cache %}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>{{ ctime }}</h1>
        {% cache 5000 xxxxx %}
            {{ ctime }}
        {% endcache %}
    </body>
    </html>

 

posted @ 2018-08-30 10:24  hexintong  阅读(397)  评论(0编辑  收藏  举报