这是一个例子
我在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代码。