【问题标题】:Initializing Custom Objects in Django Settings在 Django 设置中初始化自定义对象
【发布时间】:2011-09-12 02:16:14
【问题描述】:

我是 Django 和 Python 的新手。

我在我的应用程序根目录中创建了一个名为 services.py 的 python 文件。在这个文件中,我有一个名为 SchedulerService 的类。我正在尝试在设置模块中初始化 SchedulerService 的实例,以便每次执行视图时都可以使用它。在 Java 世界中,我会使用单例对象并使用自动初始化 servlet 或 MBean 对其进行初始化。

我遇到的问题是我无法将任何自定义模块导入到 settings.py 文件中。例如:

settings.py

from theapp.services import SchedulerService

当我尝试启动我的开发服务器时收到以下消息

Error: Can't find the file 'settings.py' in the directory containing 'manage.py'. It appears you've customized things.
You'll have to run django-admin.py, passing it your settings module.
(If the file settings.py does indeed exist, it's causing an ImportError somehow.)

如果我尝试将视图或模型类导入设置模块,我会遇到同样的错误。

也许我完全错了,应该以另一种方式实现。

任何帮助将不胜感激。

【问题讨论】:

    标签: django


    【解决方案1】:

    该特定消息是循环导入问题的特征 - theapp.services 可能会导入 settings,或者导入的东西又会导入 settings,而 Python 无法解决依赖关系。

    您可能可以通过将其中一个导入移动到函数或方法中来解决此问题,但我应该说 settings.py 强调 不是 实例化事物的地方。真的,真的不是为了那个。

    我希望由于您对“全局”对象的引用,您已经考虑了线程安全问题:不要忘记,Django 进程不会为每个请求创建和销毁,一个进程可以在被处理之前服务多个请求销毁,因此任何全局对象都将在这些请求之间共享。如果这不是您想要的,您需要在请求周期本身(可能在中间件中)实例化对象,并将其与仅持续请求生命周期的对象相关联 - 换句话说,可能是 request 对象自己。

    否则,您可以执行类似于管理应用程序的操作,并将您的实例化调用放入 urls.py

    【讨论】:

    • 你怀疑是循环依赖
    【解决方案2】:

    您的“theapp”目录是否包含__init__.py 文件?需要被识别为python模块。

    【讨论】:

    • 是的。它是 django startapp 命令创建的目录。
    【解决方案3】:

    你可以在同一个views.py中使用一个模块级的“全局”变量

    【讨论】:

      猜你喜欢
      • 2020-12-25
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      相关资源
      最近更新 更多