【问题标题】:Django app initalization code (like connecting to signals)Django 应用程序初始化代码(如连接到信号)
【发布时间】:2014-09-25 00:12:02
【问题描述】:

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

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

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

关于其他问题的重复: 以下是该问题与 S.Lott 在 cmets 中建议的重复问题的不同之处:

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

【问题讨论】:

标签: python django


【解决方案1】:

特别建议将信号放入应用的 models.py 中。

试试 models.py 或 urls.py,如果你有任何运气,请告诉我们。

【讨论】:

  • 我无法将其放入模型中,因为我需要在它自己的模块中使用该功能,并且我需要在该模块中使用我的模型。
  • 您的信号函数定义可以在一个单独的文件中(我使用 signals.py - 创意,我知道)但是然后在我的 models.py 中我在底部添加类似 post_save.connect(profile_updater , sender=MyProfile) 当然有正确的导入。
  • @ashchristopher 但如果您的信号.py 使用模型,您最终会得到循环引用。我不想在非常信号处理程序中导入模型。
  • 啊——我明白了。我通过在信号函数定义中包含导入来处理这个问题。
  • 我确实想指出,我什至可以将连接语句放入另一个模块中。我发现的主要限制是调用的方法必须可以直接访问。如果 post_save_user 函数和连接都在另一个函数中,它不会被调用。但是如果 func 直接在模块上并且连接语句在方法中,那么它将起作用。所以在models.py的底部我先“import foo”然后“foo.connect()”。
【解决方案2】:

像这样的东西的最佳位置...任何地方,只需将其导入您的 urls.py 文件(出于显而易见的原因,url 在任何请求之前加载)。

【讨论】:

  • 我希望有更明确的:(
  • 我的一些应用程序根本没有网址。 (他们只是监听信号并将附加信息存储在数据库中)
  • 如果您运行管理命令,将无法连接信号
【解决方案3】:

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

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

这仍然有可能不起作用(如果模型在您设置时尚未准备好),但请试一试并告诉我们。

【讨论】:

    【解决方案4】:

    对我来说,以下工作:

    init.py 中:

    from . import models
    from . import signals
    

    signals.py 从模型中导入,反之则不然。 Signals.py 包含导入时立即运行的模块代码,因此在 django 服务器启动时运行。

    【讨论】:

      猜你喜欢
      • 2015-10-08
      • 2011-11-17
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多