2011-09-12 55 views
2

我是Django和Python的新手。初始化Django设置中的自定义对象

我在我的应用程序根目录下创建了一个名为services.py的python文件。在这个文件里我有一个名为SchedulerService的类。我正尝试在设置模块中初始化SchedulerService的一个实例,以便每次执行视图时都可以使用该实例。在Java世界中,我将使用单例对象并使用自动init 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.) 

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

也许我正在做的完全错误,应该以另一种方式实施。

任何帮助将不胜感激。

回答

1

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

你也许可以通过移动进口函数或方法的一个解决这个问题,但我应该说,settings.py是强调是实例东西的地方。它确实不是那个意思。

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

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

+0

这是你怀疑的循环依赖 – user578888

1

您的“theapp”目录是否包含__init__.py文件?有必要将其识别为Python模块。

+0

是的。它是由django startapp命令创建的目录。 – user578888

0

您可以在相同的views.py中使用模块级别的“全局”变量