2010-01-19 47 views
8

我需要一个地方来运行应用程序特定的初始化代码(如连接到信号)。 当我将代码放入应用程序的__init__.py模块时,我最终得到了模型的循环导入。Django应用程序初始化代码(如连接到信号)

有没有办法在安装框架和执行任何请求之前触发函数?

我使用的是旧版本的django 96.6,但我也对当前版本的解决方案感兴趣。

关于其他问题的重复: 这里的问题在评论由美国洛特建议重复的区别:

评论当前的解决方案: 我不能使用的网址,因为大多数我的应用程序没有暴露任何URL。他们只是听信号并在数据库中存储附加信息。

+0

Duplicate:http:// stackoverflow。com/questions/1797046/correct-place-to-put-extra-startup-code-in-django,Duplicate:http://stackoverflow.com/questions/1986060/where-should-i-place-the-one- time-operation-in-the-django-framework –

+0

@ S.Lott它不是重复的。我需要一个在django框架初始化后立即为python解释器的每个实例运行的代码。我将在 –

回答

5

建议将信号放入应用程序的models.py中。

试试models.py或urls.py,让我们知道你是否有幸运。

+0

这个问题中详细阐述我不能将它放入模型中,因为我需要在它自己的模块中使用该函数,并且我需要在该模块中使用我的模型。 –

+0

你的信号函数定义可以在一个单独的文件中(我使用signals.py - creative,我知道),但是在我的models.py中,我在底部添加了像post_save.connect(profile_updater,sender = MyProfile)与适当的进口。 – ashchristopher

+1

@ashchristopher但如果你的signals.py使用模型,你最终会得到循环引用。我不想在非常信号处理程序中导入模型。 –

5

这样的东西最好的地方...任何地方,只需将它导入到你的urls.py文件(由于显而易见的原因,网址在任何请求之前加载)。

+0

我希望有更明确的内容:( –

+0

)我的应用根本没有网址(他们只是听信号并在数据库中存储附加信息) –

+0

如果您运行管理命令,信号将不会连接 –

2

如果你不提供网址,那么你真的需要把它放在models.py,这就是它的方式。

现在,解决你的问题:你想在自己的模块中定义它,很好,那样做。为避免循环导入,请使用django.db.models.get_model为您动态返回模型。您可以为信号模块提供初始化功能,以导入相关模型并连接相关信号。然后在models.py的末尾调用该函数,只会在您的模型初始化后运行一次。

仍然有可能无法正常工作(如果模型尚未准备好,请将其设置),但请尝试并告诉我们。

0

对于我来说,下面的工作:

INIT的.py:

from . import models 
from . import signals 

signals.py从车型的进口,而不是相反。 signals.py包含导入时立即运行并在django服务器启动时运行的模块代码。