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



这是一个例子
我在django内启动电报机器人(使用pyrogram框架(,每次我修改并保存文件或django因任何原因重新启动时,我都必须在django再次启动之前关闭pyrogram
如果我没有在服务器重新启动之前关闭pyrogram,它会在打印一句话后卡住,比如:

<modified_file_address> changed, reloading.

在这一行之后,什么都没发生,django也不会重新开始,我刚刚找到了问题的根源
Pyrogram(v0.18.0-同步版本(是由于多线程锁定键导致的。(描述起来有点复杂,与问题无关(
如果我可以在再次运行django服务器之前关闭pyrogram bot(实际上是在打印<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 Reloader并自定义它来关闭Bot

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

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

如果您让处理程序返回一个truthy值,它将停止自动回放。否则,如果它不返回或返回一个错误的值,则重新加载将继续。您可以使用它来实现您自己的重启逻辑,或者跳转实现一些拆卸逻辑,然后保留原始的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代码。

相关内容

最新更新