Django进阶之缓存和信号

一、缓存

简介

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

Django提供了6种缓存方式:

1、    开发调试

2、    内存

3、    文件

4、    数据库

5、    Memcache缓存(python-memcached模块)

6、    Memcache缓存(pylibmc模块)

通用配置

                'TIMEOUT': 300,                                               # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)'OPTIONS':{'MAX_ENTRIES': 300,                                       # 最大缓存个数(默认300)'CULL_FREQUENCY': 3,                                      # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)},'KEY_PREFIX': '',                                             # 缓存key的前缀(默认空)'VERSION': 1,                                                 # 缓存key的版本(默认1)'KEY_FUNCTION' 函数名                                          # 生成key的函数(默认函数会生成为:【前缀:版本:key】)

这部分是通用的配置,不上面6中方法中都可以使用

开发调试

    # 此为开始调试用,实际内部不做任何操作# 配置:CACHES = {'default': {'BACKEND': 'django.core.cache.backends.dummy.DummyCache',     # 引擎通用配置}}

内存

    # 此缓存将内容保存至内存的变量中# 配置:CACHES = {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache','LOCATION': 'unique-snowflake',通用配置}}# 注:其他配置同开发调试版本

文件

    # 此缓存将内容保存至文件# 配置:CACHES = {'default': {'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache','LOCATION': '/var/tmp/django_cache',通用配置}}# 注:其他配置同开发调试版本

数据库

 # 此缓存将内容保存至数据库# 配置:CACHES = {'default': {'BACKEND': 'django.core.cache.backends.db.DatabaseCache','LOCATION': 'my_cache_table', # 数据库表通用配置}}# 注:执行创建表命令 python manage.py createcachetable

Memcache缓存(python-memcached模块)

# 此缓存使用python-memcached模块连接memcacheCACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache','LOCATION': '127.0.0.1:11211',}}CACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache','LOCATION': 'unix:/tmp/memcached.sock',}}   CACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache','LOCATION': ['172.19.26.240:11211','172.19.26.242:11211',]}}

Memcache缓存(pylibmc模块)

# 此缓存使用pylibmc模块连接memcacheCACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache','LOCATION': '127.0.0.1:11211',}}CACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache','LOCATION': '/tmp/memcached.sock',}}   CACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache','LOCATION': ['172.19.26.240:11211','172.19.26.242:11211',]}}

缓存的应用

单独视图缓存

from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def my_view(request):

...

即通过装饰器的方式实现,导入模块之后,在需要缓存的函数前加@cache_page(60 * 15) 60*15表示缓存时间是15分钟

例子如下:

from django.views.decorators.cache import cache_page
@cache_page(10)
def cache(request):import timectime = time.time()return  render(request,"cache.html",{"ctime":ctime})

前端页面如下:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>{{ ctime }}</h1><h1>{{ ctime }}</h1><h1>{{ ctime }}</h1>
</body>
</html>

这样在前端页面在获取的ctime的时候就会被缓存10秒钟,10秒钟之后才会变化,但是这样的话就相当月所有的调用ctime的地方都被缓存了

局部缓存

引入TemplateTag
{% load cache %}
使用缓存
{% cache 5000 缓存key %}
缓存内容
{% endcache %}

更改前端代码如下:

{% load cache %}
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>{{ ctime }}</h1><h1>{{ ctime }}</h1>{% cache 10 c1 %}<h1>{{ ctime }}</h1>{% endcache %}
</body>
</html>

这样就实现了最后一个ctime缓存,其他两个不缓存

全站缓存

全站缓存的时候,需要在中间件的最上面添加:

'django.middleware.cache.UpdateCacheMiddleware',

在中间件的最下面添加:

'django.middleware.cache.FetchFromCacheMiddleware',

其中'django.middleware.cache.UpdateCacheMiddleware'里面只有process_response方法,在'django.middleware.cache.FetchFromCacheMiddleware'中只有process_request方法,所以最开始是直接跳过UpdateCacheMiddleware,然后从第一个到最后一个中间件的resquest,第一次没有缓存座椅匹配urls路由关系依次进过中间件的process_view,到达views函数,再经过process_exception最后经过response,到达FetchFromCacheMiddleware

通过画图进行理解:

二、信号

简介

Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。

Django内置信号

Model signalspre_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 signalspre_migrate                 # 执行migrate命令前,自动触发post_migrate                # 执行migrate命令后,自动触发
Request/response signalsrequest_started             # 请求到来前,自动触发request_finished            # 请求结束后,自动触发got_request_exception       # 请求异常后,自动触发
Test signalssetting_changed             # 使用test测试修改配置文件时,自动触发template_rendered           # 使用test测试渲染模板时,自动触发
Database Wrappersconnection_created          # 创建数据库连接时,自动触发

因为这些信号中并没有注册函数,所以运行时并没有调用触发这些信号

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

    from django.core.signals import request_finishedfrom django.core.signals import request_startedfrom django.core.signals import got_request_exceptionfrom django.db.models.signals import class_preparedfrom django.db.models.signals import pre_init, post_initfrom django.db.models.signals import pre_save, post_savefrom django.db.models.signals import pre_delete, post_deletefrom django.db.models.signals import m2m_changedfrom django.db.models.signals import pre_migrate, post_migratefrom django.test.signals import setting_changedfrom django.test.signals import template_renderedfrom django.db.backends.signals import connection_createddef callback(sender, **kwargs):print("xxoo_callback")print(sender,kwargs)xxoo.connect(callback)

这里的xxoo代指上面导入的信号,如request_finished,request_started,request_started等,而callback就是你要注册的函数

如果我们把导入信号以及将注册函数都写到一个单独的文件里,为了在程序启动的时候执行信号中的注册函数,可以在于项目同名的文件中的init文件中导入该文件即可

自定义信号

自定义信号一共需要三步骤:定义信号,注册信号,触发信号

定义信号

import django.dispatch
pizza_done=django.dispatch.Signal(providing_args=["toppings", "size"])

注册信号

def callback(sender, **kwargs):print("callback")print(sender,kwargs)pizza_done.connect(callback)

触发信号

from 路径 import pizza_donepizza_done.send(sender='seven',toppings=123, size=456)

转载于:https://blog.51cto.com/11736068/2092837

Django缓存和信号相关推荐

  1. Django之缓存和信号

    缓存 中间件和缓存之间的关系 在写缓存之前写了一个下中间件随笔.是因为一般缓存页面时,需要在respones用户之前缓存到缓存服务器,因为如果在views处理后即存入缓存,可能会与用户收到的页面不一致 ...

  2. 【python】-- Django 中间件、缓存、信号

    Django  中间件.缓存.信号 一. Django  中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的 ...

  3. Django缓存和内置信号

    缓存 简单概括就是将对数据库操作查询所得到的数据放入另外一台机器上(缓存)中,当用户再次请求时,直接去缓存中拿,避免对数据库的频繁操作,加快数据的显示时间,需要知道的是,缓存里面的数据一般都设置有超时 ...

  4. Django 缓存、序列化、信号

    一,缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcac ...

  5. python Django Session,CSRF,Model操作,Form验证,中间件,缓存,信号

    Django Session,CSRF,Model操作,Form验证,中间件,缓存,信号 Session CSRF Model 操作 Form 验证 中间件 缓存 信号 1,Session 基于coo ...

  6. Django缓存机制

    Django缓存机制三个粒度:1 全站缓存 settings.py 全局配置文件用中间件:MIDDLEWARE = [# 'django.middleware.cache.UpdateCacheMid ...

  7. Django 缓存系统

    Django 是动态网站,一般来说需要实时地生成访问的网页,展示给访问者,这样,内容可以随时变化,但是从数据库读多次把所需要的数据取出来,要比从内存或者硬盘等一次读出来 付出的成本大很多. 缓存系统工 ...

  8. drf版本控制 和django缓存,跨域问题,

    drf版本控制 基于url的get传参方式 REST_FRAMEWORK={ # "DEFAULT_AUTHENTICATION_CLASSES":["app01.aut ...

  9. 中间件和Django缓存

    中间件定义: 中间件是一个.一个的管道,如果相对任何所有的通过Django的请求进行管理都需要自定义中间件 中间件可以对进来的请求和出去的请求进行控制 中间件是一类. 看下面的代码在settings里 ...

最新文章

  1. python元类简述
  2. BZOJ 1012: [JSOI2008]最大数maxnumber(线段树)
  3. 异常处理——zookeeper启动成功,但是zkfcunexpected error, closing socket connection and attempting reconnectjava
  4. linux boot procedure
  5. JMeter: org.apache.http.NoHttpResponseException
  6. SensorKernel层框架分析
  7. 勒索病毒入侵中国, Splunk建议网络立即进行区分和隔离设置
  8. 小程序 - 首次使用
  9. Centos7安装RocketMQ及配置测试
  10. DEAP2.1软件与Malmquist指数操作说明
  11. win10怎么查看计算机用户名和密码,技术员详解win10系统查看电脑密码的详细方案...
  12. Java实现超市购物系统
  13. 一小时学会Python3爬虫基础(七)高级数据的全部操作:列表
  14. 保研心得(华东师范、东南和浙软)
  15. 2021年中国电饭锅(电饭煲)行业现状及前景分析:个性化消费推动市场向高端、智能化发展[图]
  16. latex写中文毕业论文(北交大博士毕业论文模版)
  17. ninja文件语法学习
  18. java图片处理类(图片水印,图片缩放)
  19. java系统类的名称_获取准确的操作系统名称的Java工具类
  20. CG/hlsl 内置函数

热门文章

  1. pandas读取csv文件,变换文件格式,并转换成numpy数组,取出数据
  2. 【MySQL】(图解)快速理解内连接、外连接、左连接、右连接
  3. 目标检测--Object Detection via Aspect Ratio and Context Aware
  4. logback配置控制打印台异常信息_logback异常输出详细信息(调用堆栈)分析
  5. Spring Boot实战:过滤器、拦截器与切片
  6. QuartzCore框架-- iOS中的动画
  7. edgesForExtendedLayout
  8. 过滤一批数据_手把手教你学numpy,从此数据处理不再慌【三】
  9. c语言图形方式初始化,c语言图形方式下的编程.doc
  10. 运维企业专题(6)LVS高可用与负载均衡中篇——VS/TUN模式配置详解