【问题标题】:How to run a code just before django restarts?如何在 django 重新启动之前运行代码?
【发布时间】:2021-08-08 03:39:36
【问题描述】:

情况就是这样。
我在 django 内启动了一个 telegram bot(使用 pyrogram 框架),每次修改文件并保存它或 django 以任何原因重新启动,我必须在 django 再次启动之前关闭 pyrogram。
如果我没有在服务器重启过程之前关闭 pyrogram,它会在打印如下语句后卡住:

<modified_file_address> changed, reloading.

在这行之后,什么都没有发生,django 不会再次启动,我只是找到了问题的根源。
Pyrogram(v0.18.0 - 同步版本)是由于多线程锁键引起的。(描述起来有点复杂,与问题无关)
如果我可以在再次运行 django 服务器之前关闭 pyrogram bot(字面意思是在打印 &lt;modified_file_address&gt; changed, reloading. 消息之前或之后),我可以修复它。
在 django 源代码中搜索后,这是实际打印该消息的函数。

# inside django.utils

def trigger_reload(filename):
    logger.info('%s changed, reloading.', filename)
    sys.exit(3)

现在这是我的问题:

有没有办法覆盖trigger_reload 函数或以某种方式自定义它?

如果没有:

有什么方法可以在 trigger_reload 函数之前运行函数吗?

如果再次没有:

是否可以使用另一个 Django Reloader 并自定义它来关闭机器人?

如果再次没有,我该怎么办?
有什么建议吗?

【问题讨论】:

标签: python django


【解决方案1】:

trigger_reload 将被notify_file_changed 调用。在它调用之前,它会触发file_changedsignal。所以,你可以为它注册一个处理程序。

如果你让你的处理程序返回一个真实值,它将停止自动重载。否则,如果它没有返回一个假值,则重新加载将继续。您可以使用它来实现自己的重启逻辑,或者跳转实现一些拆卸逻辑,然后保留原始的 django 自动重载:

from django.dispatch import receiver
from django.utils.autoreload import file_changed

@receiver(file_changed)
def on_file_changed(sender, **kwargs):
    print("Custom file changed...")
    return True  # returning a truthy value prevents the reload.

我认为,这些都没有记录,因此它可能会在未来的版本中中断。我只是看了一下当前的django代码。

【讨论】:

  • 真的谢谢你,你帮了我很多。无论如何,如果其他人正在阅读此评论,我也使用了autoreload_started 信号。你可以像from django.utils.autoreload import file_changed, autoreload_started 这样导入这两个信号,我的朋友在这里说如何利用它们。现在我在autoreload_started 信号相遇时启动我的机器人,并在file_changed 信号相遇时关闭它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 2012-11-29
相关资源
最近更新 更多