Django替代全局变量

时间:2016-04-06 20:17:03

标签: python django

我正在制作一个Django Web应用程序,当我加载主页时,它会使两个大词典出现。我想首先初始化后,所有视图都可以使用这个字典。我知道这可以通过全局变量来完成。但是如何在没有使用全局变量的情况下在Django中做到这一点?

this.destroy()

我希望p和歌曲可以从每个视图访问和变化。

2 个答案:

答案 0 :(得分:1)

Django本身并没有提供任何方式。在大多数情况下,使用全局变量是个坏主意。我的建议来自以下步骤:

  1. 如果您被迫将这些值存储在内存中,请使用Singleton对象而不是普通的全局变量(最后,您承担相同的风险,或类似的,所以要小心)。
  2. 声明访问对象并使数据可用或存储新值的方法。
  3. 请记住,这种方法可能会失败(实际上不会失败但效率会降低),因为可以重新加载内容。
  4. 请记住使这些方法线程安全:我的建议是使用互斥锁。
  5. 请记住,在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_dataset_datahas_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)并在其上设置一些非常大的超时值。否则,您可能希望以某种方式确保在它到期之前不断更新它。

https://docs.djangoproject.com/en/1.9/topics/cache/