加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Django 缓存、序列化、信号

发布时间:2020-12-15 17:17:31 所属栏目:大数据 来源:网络整理
导读:一,缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而

一,缓存

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

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

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

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.

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;%s:%s:%s</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、内存

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;"> {
<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. 全站使用

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.?单独视图缓存

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、局部模板使用

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

datetime datetime <span style="color: #0000ff;">class<span style="color: #000000;"> JsonCustomEncoder(json.JSONEncoder):

</span><span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; default(self,field): 

    </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; isinstance(field,datetime): 
        </span><span style="color: #0000ff;"&gt;return</span> o.strftime(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;%Y-%m-%d %H:%M:%S</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;) 
    </span><span style="color: #0000ff;"&gt;elif</span><span style="color: #000000;"&gt; isinstance(field,date): 
        </span><span style="color: #0000ff;"&gt;return</span> o.strftime(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;%Y-%m-%d</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;) 
    </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; json.JSONEncoder.default(self,field) 

<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.test.signals <span style="color: #0000ff;">import<span style="color: #000000;"> template_rendered

<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):
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">xxoo_callback<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #0000ff;">print<span style="color: #000000;">(sender,kwargs)

xxoo.connect(callback)
<span style="color: #008000;">#<span style="color: #008000;"> xxoo指上述导入的内容

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)
<span style="color: #0000ff;">def my_callback(sender,**<span style="color: #000000;">kwargs):
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">Request finished!<span style="color: #800000;">")

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

更多:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读