Django 应用初始化代码(如连接信号)
我需要一个地方来运行一些特定于应用程序的初始化代码,比如连接信号。当我把代码放到应用程序的 __init__.py
模块里时,结果导致了模型之间的循环导入问题。
有没有办法在框架设置好之后、任何请求执行之前触发一个函数呢?
我使用的是比较旧的 Django 版本 96.6,但我也对当前版本的解决方案感兴趣。
关于与其他问题重复的说明: 下面是我的问题与 S.Lott 在评论中提到的重复问题的不同之处:
在 Django 中放置额外启动代码的正确位置是什么? Django 必须完全初始化后才能运行这个函数。所以在 manage.py 中的代码是行不通的。
在 Django 框架中我应该把一次性操作放在哪里? 这个函数是用来初始化我应用程序之间的连接的。因此代码必须在每个实际处理请求的线程中运行。
对当前解决方案的评论: 我不能使用 urls,因为我的大多数应用程序没有暴露任何 urls。它们只是监听信号,并在数据库中存储额外的信息。
4 个回答
如果你不提供网址,那你就真的需要把它放在 models.py
里,这就是规则。
接下来谈谈你的问题:你想把它定义在自己的模块里,挺好的,去做吧。为了避免循环导入的问题,可以使用 django.db.models.get_model
来动态获取模型。你可以为你的信号模块提供一个初始化函数,用来导入相关的模型并连接相应的信号。这个函数会在 models.py
的最后被调用,只会运行一次,并且是在你的模型初始化之后。
不过还是有可能这个方法不奏效(如果在你设置的时候模型还没准备好),但你可以试试看,告诉我们结果如何。
这种东西最好的放置地方就是...随便哪里,只要在你的urls.py文件里导入就行了(因为很明显,urls是在任何请求之前加载的)。
信号,具体来说,建议放在你应用的 models.py 文件里。
你可以试试在 models.py 或者 urls.py 里看看,看看能不能成功。