微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django 缓存、序列化、信号

一,缓存

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

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

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

1,配置

a、开发调试

display: none;" onclick="cnblogs_code_hide('587b03d9-229d-49a8-a9ab-954c41ff47b4',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
CACHES =: , : 300,默认300,None表示永不过期,0表示立即过期) : 300,默认300) : 3,默认3) : ,默认空) : 1,默认1) : 函数名 生成key的函数函数生成为:【前缀:版本:key】) <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.

Constructs the key used by all other methods. By default it prepends
the `key_prefix'. KEY_FUNCTION can be used to specify an alternate
function with custom key making behavior.
</span><span style="color: #800000;"&gt;"""</span>
<span style="color: #0000ff;"&gt;return</span> <span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;<a href="/tag/s/" target="_blank" class="keywords">%s</a>:<a href="/tag/s/" target="_blank" class="keywords">%s</a>:<a href="/tag/s/" target="_blank" class="keywords">%s</a></span><span style="color: #800000;"&gt;'</span> %<span style="color: #000000;"&gt; (key_prefix,version,key)

<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.

Defaults to ``default_key_func``.
</span><span style="color: #800000;"&gt;"""</span>
<span style="color: #0000ff;"&gt;if</span> key_func <span style="color: #0000ff;"&gt;is</span> <span style="color: #0000ff;"&gt;not</span><span style="color: #000000;"&gt; None:
    </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; callable(key_func):
        </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; key_func
    </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt;:
        </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; import_string(key_func)
</span><span style="color: #0000ff;"&gt;return</span> default_key_func</pre>

b、内存

display: none;" onclick="cnblogs_code_hide('45ce7e65-f861-493d-9a91-fbaf954469f7',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
内容保存至内存的变量中 CACHES =: cmem.LocmemCache: Nowflake<span style="color: #008000;">#<span style="color: #008000;"> 注:其他配置同开发调试版本

c、文件

display: none;" onclick="cnblogs_code_hide('67a6ac7b-2e80-49b3-9918-8bd435159a83',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
内容保存至文件 =: :

d、数据库

display: none;" onclick="cnblogs_code_hide('c17f9ba7-baa2-42b6-b060-a432ef8fbf65',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
内容保存至数据库

<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模块)

display: none;" onclick="cnblogs_code_hide('17fe1b36-0139-4d19-aac4-85bdcd82bc90',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
=: : 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模块)

display: none;" onclick="cnblogs_code_hide('bb589970-b4a9-40b1-b410-a8d114014849',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
libmc模块连接memcache =: libmCCacheCACHES =<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;"> {
<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;">,]
}
}

2,应用

a. 全站使用

display: none;" onclick="cnblogs_code_hide('04949831-839e-4a99-99ff-446101e8bd6e',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
内容在缓存中存在, 则使用FetchFromCacheMiddleware获取内容并返回给用户, 当返回给用户之前,判断缓存中是否已经存在, 如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存 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;">
CACHE_MIDDLEWARE_SECONDS = <span style="color: #800000;">""<span style="color: #000000;">
CACHE_MIDDLEWARE_KEY_PREFIX = <span style="color: #800000;">""

b. 单独视图缓存

display: none;" onclick="cnblogs_code_hide('51817cd3-27ea-4ed4-b76b-f6236460112e',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
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;"> [
url(r<span style="color: #800000;">'<span style="color: #800000;">^foo/([0-9]{1,2})/$<span style="color: #800000;">',cache_page(60 * 15<span style="color: #000000;">)(my_view)),]

c、局部模板使用

display: none;" onclick="cnblogs_code_hide('dee12ff3-16ee-4572-8f1d-fcb107666710',event)" src="/res/2019/02-14/22/405b18b4b6584ae338e0f6ecaf736533.gif" alt="">
{</span>% load cache %<span style="color: #000000;"&gt;}

b. 使用缓存

{</span>% cache 5000 缓存key %}  <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 时间(秒)和key(key名字<a href="/tag/zidingyi/" target="_blank" class="keywords">自定义</a>)</span>

<span style="color: #000000;"> 缓存内容
{% endcache %}

更多:

二,序列化

关于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日期,所以可以通过自定义处理器来做扩展,如:

三,信号

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文件中,也是换数据库引擎的地方。

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中,所以其会自动调用,而对于自定义信号则需要开发者在任意位置触发。

更多:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐