四、缓存
由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会
更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,
5
分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿
到,并返回
Django中提供了
6
种缓存方式:
1.
开发调试
2.
内存
3.
文件
4.
数据库
5.
Memcache缓存(python
-
memcached模块)
6.
Memcache缓存(pylibmc模块)
a.开发调试
CACHES
=
{
'default'
: {
'BACKEND'
:
'django.core.cache.backends.dummy.DummyCache'
,
'TIMEOUT'
:
300
,
'OPTIONS'
:{
'MAX_ENTRIES'
:
300
,
'CULL_FREQUENCY'
:
3
,
},
'KEY_PREFIX'
: '',
'VERSION'
:
1
,
'KEY_FUNCTION'
函数名
}
}
def
default_key_func(key, key_prefix, version):
return
'%s:%s:%s'
%
(key_prefix, version, key)
def
get_key_func(key_func):
if
key_func
is
not
None
:
if
callable
(key_func):
return
key_func
else
:
return
import_string(key_func)
return
default_key_func
b. 内存缓存
此缓存将内容保存至内存的变量中
CACHES
=
{
'default'
: {
'BACKEND'
:
'django.core.cache.backends.locmem.LocMemCache'
,
'LOCATION'
:
'unique-snowflake'
,
}
}
c. 文件缓存
CACHES
=
{
'default'
: {
'BACKEND'
:
'django.core.cache.backends.filebased.FileBasedCache'
,
'LOCATION'
:
'/var/tmp/django_cache'
,
}
}
d. 数据库缓存
CACHES
=
{
'default'
: {
'BACKEND'
:
'django.core.cache.backends.db.DatabaseCache'
,
'LOCATION'
:
'my_cache_table'
,
}
}
e. Memcache缓存(python
-
memcached模块)
CACHES
=
{
'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'
,
]
}
}
f. Memcache缓存(pylibmc模块)
CACHES
=
{
'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'
,
]
}
}
缓存使用方法
1.
全站应用配置
使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获
取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,如果不存在则
UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存
MIDDLEWARE
=
[
'django.middleware.cache.UpdateCacheMiddleware'
,
'django.middleware.cache.FetchFromCacheMiddleware'
,
]
2.
单独视图函数
方式一:
from
django.views.decorators.cache
import
cache_page
@cache_page
(
60
*
15
)
def
my_view(request):
...
方式二:
from
django.views.decorators.cache
import
cache_page
urlpatterns
=
[
url(r
'^foo/([0-9]{1,2})/$'
, cache_page(
60
*
15
)(my_view)),
]
3.
局部视图使用
a. 引入TemplateTag
{
%
load cache
%
}
b. 使用缓存
{
%
cache
5000
缓存key
%
}
缓存内容
{
%
endcache
%
}
五、信号
1.
内置信号
Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,
信号允许特定的发送者去提醒一些接受者
Model signals
pre_init
post_init
pre_save
post_save
pre_delete
post_delete
m2m_changed
class_prepared
Management signals
pre_migrate
post_migrate
Request
/
response signals
request_started
request_finished
got_request_exception
Test signals
setting_changed
template_rendered
Database Wrappers
connection_created
对于Django内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数:
from
django.core.signals
import
request_finished
from
django.core.signals
import
request_started
from
django.core.signals
import
got_request_exception
from
django.db.models.signals
import
class_prepared
from
django.db.models.signals
import
pre_init, post_init
from
django.db.models.signals
import
pre_save, post_save
from
django.db.models.signals
import
pre_delete, post_delete
from
django.db.models.signals
import
m2m_changed
from
django.db.models.signals
import
pre_migrate, post_migrate
from
django.test.signals
import
setting_changed
from
django.test.signals
import
template_rendered
from
django.db.backends.signals
import
connection_created
def
callback(sender,
*
*
kwargs):
print
(
"xxoo_callback"
)
print
(sender,kwargs)
xxoo.connect(callback)
例子:
from
django.core.signals
import
request_finished
from
django.dispatch
import
receiver
@receiver
(request_finished)
def
my_callback(sender,
*
*
kwargs):
print
(
"Request finished!"
)
2.
自定义信号
a. 定义信号
import
django.dispatch
pizza_done
=
django.dispatch.Signal(providing_args
=
[
"toppings"
,
"size"
])
b. 注册信号
def
callback(sender,
*
*
kwargs):
print
(
"callback"
)
print
(sender,kwargs)
pizza_done.connect(callback)
c. 触发信号
from
路径
import
pizza_done
pizza_done.send(sender
=
'seven'
,toppings
=
123
, size
=
456
)
例子请求后打印一行数据: 配置在urls.py一层目录下面的__init__.py文件中
from
django.core.signals
import
request_finished
from
django.core.signals
import
request_started
from
django.core.signals
import
got_request_exception
from
django.db.models.signals
import
class_prepared
from
django.db.models.signals
import
pre_init, post_init
from
django.db.models.signals
import
pre_save, post_save
from
django.db.models.signals
import
pre_delete, post_delete
from
django.db.models.signals
import
m2m_changed
from
django.db.models.signals
import
pre_migrate, post_migrate
from
django.test.signals
import
setting_changed
from
django.test.signals
import
template_rendered
from
django.db.backends.signals
import
connection_created
def
test(sender,
*
*
kwargs):
print
(
"request_finished.222"
)
print
(sender, kwargs)
request_started.connect(test)
request_finished.connect(test)