我需要一个地方来运行特定于应用程序的初始化代码(比如连接到信号)。
当我将代码放到应用程序的__init__.py
模块时,我最终导致模型的循环导入。
有没有办法在框架设置时和执行任何请求之前触发函数?
我使用相当旧版本的django 96.6,但我也对当前版本的解决方案感兴趣。
关于其他问题的重复: 以下是问题与S.Lott在评论中建议的重复内容的不同之处:
Correct place to put extra startup code in django? 当函数运行时,Django需要完全初始化。因此,manage.py中的代码将无效。
Where should I place the one-time operation operation in the Django framework? 该函数初始化我的应用程序之间的连接。因此,必须在实际处理请求的每个线程中运行代码。
对当前解决方案的评论 我不能使用网址,因为我的大多数应用都没有暴露任何网址。他们只是收听信号并在数据库中存储其他信息。
答案 0 :(得分:5)
建议将信号放在应用的models.py中。
尝试使用models.py或urls.py,如果您有任何运气,请告知我们。
答案 1 :(得分:5)
像这样的东西最好的地方......在任何地方,只需将它导入你的urls.py文件中(显然原因是在任何请求之前加载urls)。
答案 2 :(得分:2)
如果你不提供网址,那么你真的需要把它放在models.py
中,就像它一样。
现在,关于你的问题:你想在自己的模块中定义它,很棒,做到这一点。要避免循环导入,请使用django.db.models.get_model
为您动态返回模型。您可以为信号模块提供初始化功能,以导入相关模型并连接相关信号。然后在models.py
结束时调用此函数,只在模型初始化后运行一次。
这仍然有可能无法正常工作(如果模型在设置时尚未准备就绪),请试一试并告诉我们。
答案 3 :(得分:0)
对我而言,以下作品:
在 init .py:
中from . import models
from . import signals
signals.py
从模型导入,但反之亦然。 signals.py包含在导入时立即运行的模块代码,因此在django服务器启动时运行。