如何(以及何时/何处)初始化Django缓存?
我想用Django的LocMemCache
来存储一些简单的值,但我不太确定在Django启动时该如何初始化缓存。Django 1.7引入了应用程序的概念,这样可以在AppConfig.ready()
中运行一些代码,这个地方很适合用来初始化缓存。不过,根据Django 1.7的文档:
“...虽然你可以像上面描述的那样访问模型类,但请避免在你的ready()实现中与数据库交互。”
假设我想存储一些来自我模型的数据库查询:
x = MyModel.objects.count()
y = MyModel.(a really expensive query)
那么我应该在什么时候以及如何初始化缓存呢?有没有推荐的“最佳实践”来做到这一点?目前,我只是把以下的cache.py
添加到了我的应用中,但我不确定我的代码是否只在第一次请求时访问数据库一次,然后在后续请求中使用缓存的值。
# cache.py
from django.core.cache import caches
from .models import MyModel
class Cache(object):
def __init__(self):
self.__count = MyModel.objects.count()
self.cache = caches['cache-storage']
@property
def total_count(self):
return self.cache.get('total_count', self.__count)
然后我这样使用缓存的值:
# view.py
from .cache import Cache
cache = Cache()
...
(some view)
counter = cache.total_count
1 个回答
0
关于在ready()里使用数据库的建议通常是不错的,但并不是总能奏效。有些应用需要根据时间表来访问数据库,而不是依赖于视图。到目前为止,我看到的唯一实现这种需求的方法就是在ready()里面。
不过,这样做会产生一个问题,因为所有的manage.py命令都会执行ready()里的代码。这就意味着在运行数据库迁移或者创建超级用户的时候,应用会用你的运行时代码去访问数据库,这样并不好。
为了解决这个问题,我在ready()里加了一个sys.argv的检查。
import sys
from django.apps import AppConfig
class MyApp(AppConfig):
name = 'MyApp'
def ready(self):
if 'runserver' in sys.argv:
# your code here