Car*_*cho 5 python django caching django-1.7
我正在尝试使用 DjangoLocMemCache来存储一些简单的值,但我不确定如何在 Django 启动时初始化缓存。Django 1.7 附带Applications,允许在 中运行一些代码AppConfig.ready(),该位置非常适合初始化缓存,但根据 Django 1.7 文档:
“ ...虽然您可以如上所述访问模型类,但请避免在 ready() 实现中与数据库交互。”
所以,假设我想从我的模型中存储一些数据库查询:
x = MyModel.objects.count()
y = MyModel.(a really expensive query)
Run Code Online (Sandbox Code Playgroud)
我应该如何以及何时初始化缓存?是否有推荐的“最佳实践”来做到这一点?目前,我刚刚将以下内容添加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)
Run Code Online (Sandbox Code Playgroud)
然后我以这种方式使用缓存的值:
# view.py
from .cache import Cache
cache = Cache()
...
(some view)
counter = cache.total_count
Run Code Online (Sandbox Code Playgroud)
小智 0
关于在ready()中使用数据库的提示通常是个好建议,但并不总是有效。某些应用程序需要根据计划而不是视图来访问数据库。我见过的实现这一点的唯一方法是在ready() 中。
这确实会产生一个问题,因为所有manage.py命令都将运行ready()中的代码。这意味着应用程序将在运行迁移或创建超级用户时使用运行时代码访问数据库,这是不理想的。
我通过在 read() 中添加 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
Run Code Online (Sandbox Code Playgroud)