Django缓存和内置信号

缓存

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

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

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

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

配置

a、开发调试

# 此为开始调试用,实际内部不做任何操作# 配置:CACHES = {'default': {'BACKEND': 'django.core.cache.backends.dummy.DummyCache',     # 引擎'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】)}}# 自定义keydef default_key_func(key, key_prefix, version):"""
        Default function to generate keys.Constructs the key used by all other methods. By default it prependsthe `key_prefix'. KEY_FUNCTION can be used to specify an alternate
        function with custom key making behavior."""
        return '%s:%s:%s' % (key_prefix, version, key)def get_key_func(key_func):"""
        Function to decide which key function to use.Defaults to ``default_key_func``."""
        if key_func is not None:if callable(key_func):return key_funcelse:return import_string(key_func)return default_key_func
View Code

b、内存

# 此缓存将内容保存至内存的变量中# 配置:CACHES = {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache','LOCATION': 'unique-snowflake',}}# 注:其他配置同开发调试版本,就是将开发调试版本里面的这几句换成上面这个即可
View Code

c、文件(网站比较小,还没钱,可以用文件的形式)

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

d、数据库

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

e、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',]}}
View Code

f、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',]}}
View Code

g. Redis缓存(依赖:pip3 install django-redis)

CACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://127.0.0.1:6379","OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient","CONNECTION_POOL_KWARGS": {"max_connections": 100}# "PASSWORD": "密码",}}
}
View Code
from django_redis import get_redis_connection
conn = get_redis_connection("default")
视图中链接并操作

应用

a. 全站使用(利用Django中间件)

使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存MIDDLEWARE = ['django.middleware.cache.UpdateCacheMiddleware',# 其他中间件...'django.middleware.cache.FetchFromCacheMiddleware',]CACHE_MIDDLEWARE_ALIAS = ""CACHE_MIDDLEWARE_SECONDS = ""CACHE_MIDDLEWARE_KEY_PREFIX = ""
View Code

b. 单独视图缓存

方式一:from django.views.decorators.cache import cache_page@cache_page(60 * 15)def my_view(request):...方式二:from django.views.decorators.cache import cache_pageurlpatterns = [url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),]
View Code

c、局部视图(html页面)使用

a. 引入TemplateTag{% load cache %}b. 使用缓存{% cache 5000 缓存key %}缓存内容{% endcache %}
View Code

 

信号

抛砖引玉

1.如何对数据库的增加操作记录日志

2.信号比中间件的区别

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

对于Django内置的信号,仅需在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指上述导入的模块名
View Code
from django.core.signals import request_finished
from django.dispatch import receiver@receiver(request_finished)
def my_callback(sender, **kwargs):print("Request finished!")
View Code

自定义信号

 

转载于:https://www.cnblogs.com/Dominic-Ji/p/9279742.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实例33:python

#题目:按逗号分隔列表。 #!/usr/bin/python -- coding: UTF-8 -- L [1,2,3,4,5] s1 ‘,’.join(str(n) for n in L) print (s1)

大工19春计算机文化基础在线测试1,大工19春《计算机文化基础》在线测试1(含答案)...

1.[单选题]第四代计算机所采用的主要逻辑元件是( )。奥鹏作业答案奥鹏大连理工大学作业A.晶体管B.小规模集成电路C.电子管D.大规模和超大规模集成电路正确答案:——D——2.[单选题]二进制数11111010所对应的十进制数是( )。A.250B.252C.253D.255正确答案:——A——3.[单选题]下…

f2 柱状图滚动 钉钉小程序_详解钉钉小程序组件之自定义模态框(弹窗封装实现)...

背景开发钉钉小程序中需要用到模态框 文档里也没有 自己搞一个…效果大概长这个样点击指定按钮,弹出模态框,里面的内容可以自定义,可以是简单的文字提示,也可以输入框等复杂布局。操作完点击取消或确定关闭。开始封装上图所示文件…

Python List reverse()方法

描述 reverse() 函数用于反向列表中元素。 语法 reverse()方法语法: list.reverse() 参数 • NA。 返回值 该方法没有返回值,但是会对列表的元素进行反向排序。 实例 以下实例展示了 reverse()函数的使用方法: #!/usr/bin/python aList [12…

你的第一个Django程序

本文使用Pycharm、Django 2.0.9、Python 3.6环境,本文大纲 建立Django项目建立页面什么是URLconf和ROOT_URLCONFDjango怎么处理URL请求关于URL尾部的“/” 反斜线1. 建立一个Django项目 Application name如果填写会自动帮你建立一个APP,而且APP是必须的&…

闪电对计算机或网络设备的威胁,计算机网络的雷电防护_计算机网络

摘?要 雷电对计算机网络稳定性造成了很多的危害。雷电主要通过电源线、网络线和接地反击的途径来侵入设备,造成设备损坏。如何来确保设备的安全,本文从网络系统的防护、网络线路的防护、及其防雷工程中需要特别考虑过电压防护几个方面提出了防护措施。关…

分割法和填补法_“聚合”法与“分割”法

一门新的思维与实践的科学“聚合”法是宗脉学中“宗脉”关系的根本原则,这是一门新的思维与实践的科学,它的研究角度和方法都不同于任何以往唯物主义与唯心主义学派。“宗”即是整体,本质,聚和,“脉”是本质的分支与脉…

Python join()方法

描述 Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。 语法 join()方法语法: str.join(sequence) 参数 • sequence – 要连接的元素序列。 返回值 返回通过指定字符连接序列中元素后生成的新字符串。 实例 以下实例展示了join()的使用方…

[USACO 2017 Feb Gold] Tutorial

Link: 传送门 A: 分层图最短路&#xff08;其实就是最短路转移时多记录一维的数据 #include <bits/stdc.h>using namespace std; #define X first #define Y second typedef double db; typedef long long ll; typedef pair<int,int> P; const int MAXN105; int n,…

平板xmind怎么添加父主题_xmind 怎么插入子主题

XMind添加主题方法一&#xff1a;XMind地址&#xff1a;网页链接点击标题栏中的【插入】&#xff0c;在弹出的内下拉窗口中便可看见容主题、子主题、自由主题等选项&#xff0c;我们点击想要添加的主题类型&#xff0c;然后直接点击便会对应的在导图中生成新的空白主题&#xf…

实例34:python

#练习函数调用。 #!/usr/bin/python -- coding: UTF-8 -- def hello_world(): print (‘hello world’) def three_hellos(): for i in range(3): hello_world() if name ‘main’: three_hellos() #1&#xff1a;__name__是一个变量。前后加了下划线是因为是因为这是系统…

NumPy数组创建例程

NumPy - 数组创建例程 新的ndarray对象可以通过任何下列数组创建例程或使用低级ndarray构造函数构造。 numpy.empty 它创建指定形状和dtype的未初始化数组。 它使用以下构造函数&#xff1a; numpy.empty(shape, dtype float, order C)构造器接受下列参数&#xff1a; 序号参…

python做接口自动化测试仪器经销商_Python接口自动化测试的实现

接口测试的方式有很多&#xff0c;比如可以用工具(jmeter,postman)之类&#xff0c;也可以自己写代码进行接口测试&#xff0c;工具的使用相对来说都比较简单&#xff0c;重点是要搞清楚项目接口的协议是什么&#xff0c;然后有针对性的进行选择&#xff0c;甚至当工具不太适合…

计算机进去pe怎么设置用户,电脑密码怎么设置,教您设置电脑开机密码

为了保障电脑重要资料的安全&#xff0c;不被其他同事看到&#xff0c;我们都会给自己的电脑设置开机密码&#xff0c;有了开机密码就可以让别人不能直接使用我们的电脑了&#xff0c;那么电脑开机密码如何设置呢&#xff1f;下面小编给您耐心讲解下电脑开机密码设置方法。说到…

实例35:python

#文本颜色设置 #!/usr/bin/env python -- coding:utf-8 -- Python设置文本文字颜色 class bcolors: HEADER ‘\033[95m’ # pink OKBLUE ‘\033[94m’ # blue OKGREEN ‘\033[92m’ # green WARNING ‘\033[93m’ # yellow FAIL ‘\033[91m’ # red ENDC ‘\033[0m’…

「BZOJ2200」[Usaco2011 Jan] 道路和航线 - 最短路+拓扑排序

->点我进原题[Usaco2011 Jan]道路和航线 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 1116 Solved: 410 Description Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查。他想把牛奶送到T个城镇 (\(1 < T < 25,000\))&#xff0c;编号为\(1\)~\(T\)。…

哈佛大学计算机科学专,哈佛大学计算机科学专业

哈佛大学计算机科学专业通过哈佛文理研究生院申请并统一管理&#xff0c;要求申请者递交GRE成绩&#xff0c;但并无最低GRE分数要求。该项目设有BA/MS、PhD两个项目。所有PhD学生均可以获得全额奖学金&#xff0c;但不向硕士学生发放奖学金。哈佛大学计算机科学专业设置计算机架…

excel亮灯怎么设置_Excel表格技巧—怎么给表格设置密码

很多 Excel 表格里都有一些重要信息&#xff0c;但是当我们给别人发Excel表格时&#xff0c;别人可能会不小心或者故意更改表中数据。怎么才能避免这些表格的数据被更改呢&#xff1f;小编在这里和大家分享一个技巧&#xff1a;给表格设置密码&#xff01;如下图&#xff0c;假…

Collection和Collections的区别是什么

1&#xff09;java.util.Collection是一个集合顶层接口&#xff0c;该接口的设计目的是为各种具体的集合提供最大化的统一的操作方式&#xff0c;它提供了对集合对象进行基本操作的通用接口方法&#xff0c;实现该接口的类主要有List和Set 2&#xff09;java.util.Collections是…

实例36:python

#题目&#xff1a;求100之内的素数。 #!/usr/bin/python -- coding: UTF-8 -- 输出指定范围内的素数 用户输入数据 lower int(input("输入区间最小值: ")) upper int(input("输入区间最大值: ")) for num in range(lower,upper 1): # 素数大于 1 …