zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    WINDOWS API ——GETFILETIME——获取文件时间
    lua 源码分析之线程对象lua_State
    GPL、BSD、MIT、Mozilla、Apache、LGPL开源协议介绍
    BOOST 线程完全攻略
    宏定义中#和##符号的使用和宏定义展开问题
    weak_ptr<T>智能指针
    轻松记住大端小端的含义(附对大端和小端的解释)
    关于VC预定义常量_WIN32,WIN32,_WIN64
    VC 预定义宏
    php技术之路
  • 原文地址:https://www.cnblogs.com/hexintong/p/9558562.html
Copyright © 2011-2022 走看看