我正在制作一个Django Web应用程序,当我加载主页时,它会使两个大词典出现。我想首先初始化后,所有视图都可以使用这个字典。我知道这可以通过全局变量来完成。但是如何在没有使用全局变量的情况下在Django中做到这一点?
this.destroy()
我希望p和歌曲可以从每个视图访问和变化。
答案 0 :(得分:1)
Django本身并没有提供任何方式。在大多数情况下,使用全局变量是个坏主意。我的建议来自以下步骤:
请记住,在Python中,要么将某些内容存储在全局引用的成员中,要么声明一个全局变量。这是对你所做的一个小调整:
def startLoading():
global p, songs
# If you don't acquire a mutex here, God will flood earth again
if not (p or songs):
p, songs = loadSongs()
# release the mutex
return p, songs
我总是建议另外提一下存储一切(我后来告诉你的单身人士):
from a.certain.module import my_store
def startLoading():
# ACQUIRE MUTEX here
if not myStore.has_data():
my_store.set_data(loadSongs())
# RELEASE MUTEX here
return my_store.get_data()
get_data
,set_data
和has_data
所做的事取决于您。 我仍然认为存储全局值是一个糟糕的想法,特别是如果你使用类似gunicorn的东西并且有几个(2n + 1)django进程参与客户端。 总是优先考虑像memcache 这样的外部流程来实现这一目标。但如果你坚持,你有这些指导方针。
答案 1 :(得分:-1)
最明显的方法是使用Django Cache框架。您需要将CACHES变量添加到settings.py中,然后您可以在项目加载
上执行此类操作from django.conf import settings from django.core.cache import caches cache = caches['default'] key=settings.THEKEY # the cache key to access your dictionary the_dict = generate_the_big_dict() cache.set(key, the_dict)
在您需要访问字典的视图中,您可以执行类似
的操作from django.conf import settings from django.core.cache import caches cache = caches['default'] key=settings.THEKEY the_dict = cache.get(key)
如果你真的只想生成一次密钥,你可以将它的生成放入django app ready()方法(相关文档链接https://docs.djangoproject.com/en/1.9/ref/applications/#django.apps.AppConfig.ready)并在其上设置一些非常大的超时值。否则,您可能希望以某种方式确保在它到期之前不断更新它。