django-内部封装的缓存方法

 

 

新开启一个django项目,

项目的urls.py文件中写入url,

from django.conf.urls import url
from django.contrib import admin
from app01 import  views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'index/',views.index),
    url(r'add_author/',views.add_author),
    url(r'add_book/',views.add_book)
]

方式一,通过装饰器,缓存的是整个页面

django封装的缓存机制
方式一:装饰器   整个页面级别的缓存下来
@cache_page(15)
def index(request):

    import time
    t=time.time()
    return render(request,"index.html",locals())

def foo(request):
    s=time.time()
    return render(request,"index.html",locals())
View Code

方式二:通过中间件,缓存的也是整个页面

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',#中间件级别的做缓存,这个一定要作为最后一个元素

]

CACHE_MIDDLEWARE_SECONDS=10 #设置缓存10秒之后刷新

重启项目,然后再去访问视图foo

方式三:通过模板做局部缓存

{% load cache %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

{% cache 15 "time_cache" %}
<h3>缓存时间:{{ t }}</h3>       <!--页面刷新一直显示缓存住的时间,在15秒后刷新 -->
{% endcache %}
<h3>当前时间:{{ t }}</h3>       <!--只要刷新页面时间就会改变, -->


</body>
</html>
def index(request):

    import time
    t=time.time()
    return render(request,"index.html",locals())
View Code
django的信号
在应用的models.py中写两个类
from django.db import models

# Create your models here.
class Book(models.Model):
    name=models.CharField(max_length=32)

class author(models.Model):
    name=models.CharField(max_length=32)
app 的models.py
from .models import *
def add_book(request):
    Book.objects.create(name="alex")
    return HttpResponse("ok")

def add_author(request):
    author.objects.create(name="alex")
    return HttpResponse("ok")
app 的views.py

进行一下数据库迁移

在项目的__init__.py中写入

from django.db.models.signals import post_save


def get_model_create_logger(sender,**kwargs):
    # print("get_model_create_logger")
    print(sender,kwargs.get("instance"))    #<class 'app01.models.author'> author object
    import logging
    logging.warning("%s创建了一%s的实例对象"%(sender._meta.model_name,kwargs.get("instance")))


post_save.connect(get_model_create_logger)    #一旦有models的对象被创建成功并保存后就触发post_save执行get_model_create_logger这个函数

重启项目

没创建一个model中的对象就会打印一条日志

 

 

总结:

方式一:装饰器级别的缓存整个页面
使用装饰器的方法是缓存的整个页面,index视图中有做缓存,foo视图中没有做缓存,所以访问index时会有缓存的作用,而foo在页面中时间是可以正常刷新的

方式二:中间件级别的缓存整个页面
    在中间件MIDDLEWARE列表中的第一个元素一定要写'django.middleware.cache.UpdateCacheMiddleware',最后一个元素一定要写
    'django.middleware.cache.FetchFromCacheMiddleware',才能起到通过中间件做缓存的作用
    MIDDLEWARE下面写上设置:
    CACHE_MIDDLEWARE_SECONDS=10是设置缓存10秒之后刷新

方式三:局部缓存,是在模板中做的局部缓存
    在模板中的第一行写上{% load cache%}
    把需要做缓存的部分放在{% cache 15 "time_cache"%}, 15表示的是时间15秒后刷新,也就是缓存时间是15秒,time_cache是给缓存起的别名
缓存
另外一个知识点:django的信号
    需求是:在django中的models每创建一个对象,就打印到日志中,
    实现方法一:  在视图中每创建一个对象,就在该行代码下面打印一下日志,但是如果有很多表,不能每次都写一行在打印日志的代码,这样会有代码的重复,不能实现代码的解耦
        所以需要有一个""可以来盯着,一旦有创建就发送一个信号,让另外一个""打印出日志
   
    django中的信号:
        Django提供一种信号机制。其实就是观察者模式,又叫发布-订阅(Publish/Subscribe) 。当发生一些动作的时候,发出信号,然后监听了这个信号的函数就会执行。

        通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。用于在框架执行操作时解耦。
   
    解决思路:可以像django连接mysql时做的操作一样,在项目的__init__文件中写上配置,这样在项目启动的时候就可以把它加载,作为一个监督人,来监督是models是否有创建新的对象
    
    解决方案:在项目的__init__文件中写入,
        from django.db.models.signals import post_save
        def get_model_create_logger(sender, **kwargs):
            print("post_save_callback")
            print(sender, kwargs.get("instance"))   #sender是类名,kwargs.get("instance")是创建出来的对象
            import logging
            logging.warning("%s创建了一个%s的实例对象"%(sender._meta.model_name,kwargs.get("instance")))
        
        post_save.connect(get_model_create_logger)   #post_save是models的对象创建成功并保存之后触发,一旦触发post_save就会执行connect的方法
        

'''
'''
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          # 创建数据库连接时,自动触发
    
Django 提供了一系列的内建信号,允许用户的代码获得DJango的特定操作的通知。这包含一些有用的通知:
django.db.models.signals.pre_save & django.db.models.signals.post_save

在模型 save()方法调用之前或之后发送。
django.db.models.signals.pre_delete & django.db.models.signals.post_delete

在模型delete()方法或查询集的delete() 方法调用之前或之后发送。
django.db.models.signals.m2m_changed

模型上的 ManyToManyField 修改时发送。
django.core.signals.request_started & django.core.signals.request_finished

Django建立或关闭HTTP 请求时发送。    

对于Django内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数:

'''
django的信号

 

posted @ 2018-03-31 17:07  dwenwen  阅读(49)  评论(0)    收藏  举报