如何在 django 重新启动之前运行代码?

时间:2021-05-18 21:12:18

标签: python django

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

<modified_file_address> changed, reloading.

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

# inside django.utils

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

现在这是我的问题:

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

如果没有:

有没有办法在 trigger_reload 函数之前运行函数?

如果没有了:

是否可以使用另一个 Django 重新加载器并对其进行自定义以关闭机器人?

如果再不行,我该怎么办?
有什么建议吗?

1 个答案:

答案 0 :(得分:1)

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

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

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代码。