Django 缓存、序列化、信号
一,缓存由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者memcache中之前缓存的内容拿到,并返回。 Django中提供了6种缓存方式:
1,配置a、开发调试
CACHES =: ,
: 300,
: 300,
: 3,
: ,
: 1,
:
<span style="color: #008000;">#<span style="color: #008000;"> 自定义key
<span style="color: #0000ff;">def<span style="color: #000000;"> default_key_func(key,key_prefix,version): <span style="color: #800000;">"""<span style="color: #800000;"> Default function to generate keys.
<span style="color: #0000ff;">def<span style="color: #000000;"> get_key_func(key_func):<span style="color: #800000;">"""<span style="color: #800000;"> Function to decide which key function to use.
b、内存
CACHES =: : <span style="color: #008000;">#<span style="color: #008000;"> 注:其他配置同开发调试版本
c、文件
=: :
d、数据库 <span style="color: #008000;"># <span style="color: #008000;"> 配置:CACHES =<span style="color: #000000;"> { <span style="color: #800000;">'<span style="color: #800000;">default<span style="color: #800000;">'<span style="color: #000000;">: { <span style="color: #800000;">'<span style="color: #800000;">BACKEND<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">django.core.cache.backends.db.DatabaseCache<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">LOCATION<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">my_cache_table<span style="color: #800000;">',<span style="color: #008000;">#<span style="color: #008000;"> 数据库表 <span style="color: #000000;"> } } <span style="color: #008000;">#<span style="color: #008000;"> 注:执行创建表命令 python manage.py createcachetable e、Memcache缓存(python-memcached模块)
=: : CACHES =<span style="color: #000000;"> {
<span style="color: #800000;">'<span style="color: #800000;">default<span style="color: #800000;">'<span style="color: #000000;">: { <span style="color: #800000;">'<span style="color: #800000;">BACKEND<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">django.core.cache.backends.memcached.MemcachedCache<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">LOCATION<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">unix:/tmp/memcached.sock<span style="color: #800000;">'<span style="color: #000000;">,} } CACHES =<span style="color: #000000;"> {<span style="color: #800000;">'<span style="color: #800000;">default<span style="color: #800000;">'<span style="color: #000000;">: { <span style="color: #800000;">'<span style="color: #800000;">BACKEND<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">django.core.cache.backends.memcached.MemcachedCache<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">LOCATION<span style="color: #800000;">'<span style="color: #000000;">: [ <span style="color: #800000;">'<span style="color: #800000;">172.19.26.240:11211<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">172.19.26.242:11211<span style="color: #800000;">'<span style="color: #000000;">,] } } f、Memcache缓存(pylibmc模块)
=: CACHES =<span style="color: #000000;"> {
<span style="color: #800000;">'<span style="color: #800000;">default<span style="color: #800000;">'<span style="color: #000000;">: { <span style="color: #800000;">'<span style="color: #800000;">BACKEND<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">django.core.cache.backends.memcached.PyLibMCCache<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">LOCATION<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">/tmp/memcached.sock<span style="color: #800000;">'<span style="color: #000000;">,} } CACHES =<span style="color: #000000;"> { 2,应用a. 全站使用 MIDDLEWARE =<span style="color: #000000;"> [
<span style="color: #800000;">'<span style="color: #800000;">django.middleware.cache.UpdateCacheMiddleware<span style="color: #800000;">',<span style="color: #008000;">#<span style="color: #008000;"> 最开始位置 <span style="color: #008000;">#<span style="color: #008000;"> 其他中间件... <span style="color: #800000;">'<span style="color: #800000;">django.middleware.cache.FetchFromCacheMiddleware<span style="color: #800000;">',<span style="color: #008000;">#<span style="color: #008000;"> 最后位置 <span style="color: #000000;">] CACHE_MIDDLEWARE_ALIAS = <span style="color: #800000;">""<span style="color: #000000;"> b.?单独视图缓存
django.views.decorators.cache @cache_page(60 * 15<span style="color: #000000;">)
<span style="color: #0000ff;">def<span style="color: #000000;"> my_view(request): ... <span style="color: #008000;">#<span style="color: #008000;"> 方式二: <span style="color: #0000ff;">from django.views.decorators.cache <span style="color: #0000ff;">import<span style="color: #000000;"> cache_page urlpatterns =<span style="color: #000000;"> [ c、局部模板使用 {</span>% load cache %<span style="color: #000000;">}
b. 使用缓存
<span style="color: #000000;"> 缓存内容 更多: 二,序列化关于Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式。 1、serializers django.core ret =<span style="color: #000000;"> models.BookType.objects.all()
data = serializers.serialize(<span style="color: #800000;">"<span style="color: #800000;">json<span style="color: #800000;">",ret)2、json.dumps <span style="color: #008000;">#<span style="color: #008000;">ret = models.BookType.objects.all().values('caption')
ret = models.BookType.objects.all().values_list(<span style="color: #800000;">'<span style="color: #800000;">caption<span style="color: #800000;">'<span style="color: #000000;">) ret=<span style="color: #000000;">list(ret) result = json.dumps(ret) 由于json.dumps时无法处理datetime日期,所以可以通过自定义处理器来做扩展,如: datetime datetime <span style="color: #0000ff;">class<span style="color: #000000;"> JsonCustomEncoder(json.JSONEncoder):
<span style="color: #008000;">#<span style="color: #008000;"> ds = json.dumps(d,cls=JsonCustomEncoder)
三,信号Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。 1,Django内置信号
post_init
pre_save
post_save
pre_delete
post_delete
m2m_changed
class_prepared
post_migrate
Request/
request_finished
got_request_exception
template_rendered
对于Django内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数: 注册信号,写入与project同名的文件夹下的_init_.py文件中,也是换数据库引擎的地方。 django.core.signals django.core.signals django.core.signals <span style="color: #0000ff;">from django.db.models.signals <span style="color: #0000ff;">import<span style="color: #000000;"> class_prepared
<span style="color: #0000ff;">from django.db.models.signals <span style="color: #0000ff;">import<span style="color: #000000;"> pre_init,post_init <span style="color: #0000ff;">from django.db.models.signals <span style="color: #0000ff;">import<span style="color: #000000;"> pre_save,post_save <span style="color: #0000ff;">from django.db.models.signals <span style="color: #0000ff;">import<span style="color: #000000;"> pre_delete,post_delete <span style="color: #0000ff;">from django.db.models.signals <span style="color: #0000ff;">import<span style="color: #000000;"> m2m_changed <span style="color: #0000ff;">from django.db.models.signals <span style="color: #0000ff;">import<span style="color: #000000;"> pre_migrate,post_migrate <span style="color: #0000ff;">from django.test.signals <span style="color: #0000ff;">import<span style="color: #000000;"> setting_changed <span style="color: #0000ff;">from django.db.backends.signals <span style="color: #0000ff;">import<span style="color: #000000;"> connection_created <span style="color: #0000ff;">def callback(sender,**<span style="color: #000000;">kwargs): xxoo.connect(callback) my_callback(sender,**(<span style="color: #008000;">#<span style="color: #008000;"> 方法一:
<span style="color: #0000ff;">from django.core.signals <span style="color: #0000ff;">import<span style="color: #000000;"> request_finished request_finished.connect(my_callback) <span style="color: #008000;">#<span style="color: #008000;"> 方法二:<span style="color: #0000ff;">from django.core.signals <span style="color: #0000ff;">import<span style="color: #000000;"> request_finished <span style="color: #0000ff;">from django.dispatch <span style="color: #0000ff;">import<span style="color: #000000;"> receiver @receiver(request_finished) django.db.models.signals django.dispatch myapp.models @receiver(pre_save,sender=<span style="color: #000000;">MyModel)
<span style="color: #0000ff;">def my_handler(sender,**<span style="color: #000000;">kwargs): ... 2,自定义信号a. 定义信号 在某py文件中定义信号。 = django.dispatch.Signal(providing_args=[,])
b. 注册信号 在_init_.py 中注册信号 callback(sender,**(pizza_done.connect(callback)
c. 触发信号 路径 pizza_done.send(sender=<span style="color: #800000;">'<span style="color: #800000;">seven<span style="color: #800000;">',toppings=123,size=456)
由于内置信号的触发者已经集成到Django中,所以其会自动调用,而对于自定义信号则需要开发者在任意位置触发。 更多: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |