16

我正在运行一个快速的 api,当我开发时,我的 app.py 文件中有以下代码

app.py 中的代码:

import uvicorn


if __name__=="__main__":
    uvicorn.run("app.app:app",host='0.0.0.0', port=4557, reload=True, debug=True, workers=3)

所以我正要CMD ["python3","app.py"]在我的 Dockerfile 中运行。

在 fastapi 示例中,他们做了这样的事情:

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]

我想知道这两种方法之间有什么区别,因为我认为它们都可以工作。

4

2 回答 2

18

不,没有区别。

命令行运行方法(uvicorn app.main:app)和使用python命令(python app.py)执行app.py是一样的。这两种方法都在后台调用uvicorn.main.run(...)函数。

换句话说,该uvicorn命令是该功能的快捷方式uvicorn.run(...)

所以,在你的情况下,函数调用

uvicorn.run("app.app:app",host='0.0.0.0', port=4557, reload=True, debug=True, workers=3)

可以通过 uvicorn 命令行来完成,

uvicorn app.app:app --host 0.0.0.0 --port 4557 --reload --debug --workers 3

旁注

--debug选项在命令行选项帮助页面中是隐藏的,但可以在源代码中找到。因此,感觉使用uvicorn命令运行应用程序可以被视为生产的东西。

于 2020-07-31T12:31:42.103 回答
2

答案是否定的。应用程序没有区别,使用Docker部署只是让它更容易,如果没有 Docker,您需要使用与ASGI兼容的服务器(如 Uvicorn)运行它,您可能还需要设置一些工具以确保它在停止或停止时自动重新启动崩溃。Docker 映像可以自动处理所有这些作业,而不是尝试手动处理它。

于 2020-07-30T18:50:08.890 回答