【问题标题】:Django: Keep a persistent reference to an object?Django:保持对对象的持久引用?
【发布时间】:2013-08-08 15:59:38
【问题描述】:

我很高兴接受这可能是不可能的,更不用说明智了,但是是否可以保持对我创建的对象的持久引用?

例如,在我的一些观点中,我的代码看起来有点像这样(为清楚起见进行了简化):

api = Webclient()
api.login(GPLAY_USER,GPLAY_PASS)
url = api.get_stream_urls(track.stream_id)[0]

client = mpd.MPDClient()
client.connect("localhost", 6600)
client.clear()
client.add(url)
client.play()
client.disconnect()

如果我可以在整个项目中只保留一个对apiclient 的引用,那将非常简洁,尤其是为了避免使用gmusicapi 重复进行api 登录。我可以在settings.py 中声明它们吗? (我猜这是一个糟糕的主意),或者通过其他方式与他们保持持久的联系?

理想情况下,我将拥有像 get_api() 这样的函数,它会检查现有对象是否仍然正常并返回它或根据需要创建一个新对象。

【问题讨论】:

  • 为什么不将这两个对象存储到pickle 文件中?
  • @Paco 有趣的想法。这看起来很奇怪,但我无法想象为什么它不起作用,尽管我以前从未使用过泡菜。

标签: python django


【解决方案1】:

您不能让每个应用程序实例化一次,因为您几乎肯定会拥有多个服务器进程,并且对象不容易跨进程共享。但是,每个进程一个绝对是可能的,而且是值得的。为此,您只需在相关文件(例如views.py)中的模块级别实例化它。这意味着它将在 Django 首次导入该文件(在该过程中)时自动实例化,您可以将其称为该文件中的全局变量。只要进程存在,它就会一直存在,当创建新进程时,将实例化一个新的全局变量。

【讨论】:

    【解决方案2】:
    1. 您可以将它们设置为您的应用程序对象或某些 在您的顶层声明的其他应用程序对象 项目 - 在其他任何需要之前。
    2. 如果您将它们放入一个在第一个实例化的类中 导入,然后仅用于其余部分,可以通过以下方式导入 几个模块并访问。

    无论哪种方式,他们的生命都会与处决一样长。

    【讨论】:

    • 你能不能更具体一点 Django?
    • 对不起 - 我现在不使用 Django。
    【解决方案3】:

    你不能持久化对象引用,但是你可以在内存 django 缓存或 memcached django 缓存中存储一​​些东西。

    Django 缓存 https://docs.djangoproject.com/en/dev/topics/cache/

    另请参阅 Creating a Persistent Data Object In Django

    【讨论】:

      猜你喜欢
      • 2015-02-18
      • 1970-01-01
      • 2016-11-14
      • 2012-01-05
      • 2011-05-15
      • 2011-05-30
      相关资源
      最近更新 更多