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())
方式二:通过中间件,缓存的也是整个页面
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())
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)
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")
进行一下数据库迁移
在项目的__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内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数: '''

浙公网安备 33010602011771号