如何从 Poetry 运行 FastAPI 应用程序?

Bra*_*der 5 python-poetry fastapi uvicorn

我有一个由诗歌构建的 fastapi 项目。我想在 pyproject.tom 中使用脚本部分运行应用程序,如下所示:

poetry run start
Run Code Online (Sandbox Code Playgroud)

该部分中的双引号内是什么?

[tool.poetry.scripts]
start = ""
Run Code Online (Sandbox Code Playgroud)

我尝试运行以下脚本。

import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}

def main():
    print("Hello World")
    uvicorn.run(app, host="0.0.0.0", port=8000, reload=True, workers=2)

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

它停止应用程序并只显示这样的警告。

警告:您必须将应用程序作为导入字符串传递以启用“重新加载”或“工人”。

Kik*_*ohs 6

我找到了解决这个问题的方法。见下文:

pyproject.toml

[tool.poetry.scripts]
start = "my_package.main:start"
Run Code Online (Sandbox Code Playgroud)

在您的main.py内部my_package文件夹中。

import uvicorn
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello World"}

def start():
    """Launched with `poetry run start` at root level"""
    uvicorn.run("my_package.main:app", host="0.0.0.0", port=8000, reload=True)
Run Code Online (Sandbox Code Playgroud)


Gre*_* Li 5

您将需要传递模块路径 ( module:function):

[tool.poetry.scripts]
start = "app:main"
Run Code Online (Sandbox Code Playgroud)

现在运行下面的命令将调用模块中的main函数app

$ poetry run start
Run Code Online (Sandbox Code Playgroud)


eur*_*i10 4

正如错误消息所示,执行以下操作

uvicorn.run("app")
Run Code Online (Sandbox Code Playgroud)

另请注意,使用重新加载和工作人员是无用的,只会使用重新加载器。这些标志是互斥的