如何(以及何时/何处)初始化Django缓存?

5 投票
1 回答
679 浏览
提问于 2025-04-29 18:03

我想用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

撰写回答