Uvicorn Detect --reload 主线程

ale*_*ird 5 fastapi uvicorn pyngrok

我有一个简单的Uvicorn应用程序(使用FastAPI构建)。开发中,uvicorn server:app --reload。该--reload参数表示将启动两个线程,一个用于服务器,一个用于监视文件更改\xe2\x80\x94当检测到文件更改时,将重新启动服务器线程。

\n

到目前为止没有什么特别的。这在 Flask、Django 和其他开发服务器中也很常见。问题是,我想pyngrok在启动开发服务器时使用打开一个隧道,并且我希望该隧道与这两个线程的父线程一样长寿。也就是说,当检测到文件更改并重新启动开发服务器时,我不希望重新启动隧道(因为ngrok这会导致生成新的公共 URL 并中断现有连接)。

\n

使用 Flask 和 Django,这相对容易完成。例如,对于 Flask,我只是这样做os.environ.get("WERKZEUG_RUN_MAIN") != "true",对于 Django,我类似地评估RUN_MAIN环境变量,并且在任何一种情况下,我仅在将这些设置为 时才实例化隧道true。我找不到与 Uvicorn 一起使用的类似变量。有人可以帮忙吗?

\n

小智 0

在使用 Uvicorn 运行的 FastAPI 应用程序中,您可以--reload通过检查sys.argv列表来检查该选项是否已启用。该sys.argv列表包含传递给脚本的命令行参数,当--reload使用该选项时,它将出现在列表中。

您可以使用以下代码来确定该--reload选项是否启用:

import sys

def is_reload_enabled():
    return "--reload" in sys.argv

if is_reload_enabled():
    # Do not instantiate the tunnel when --reload is enabled
    print("Reload is enabled. Tunnel should not be started.")
else:
    # Instantiate the tunnel when --reload is not enabled
    print("Reload is disabled. Start the tunnel here.")
Run Code Online (Sandbox Code Playgroud)