Reputation: 513
I have a fastapi project built by poetry. I want to run the application with a scripts section in pyproject.tom like below:
poetry run start
What is inside double quotes in the section?
[tool.poetry.scripts]
start = ""
I tried to run the following script.
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()
It stops the application and just shows warning like this.
WARNING: You must pass the application as an import string to enable 'reload' or 'workers'.
Upvotes: 34
Views: 49237
Reputation: 11
I am not sure why you wants to run with the start, but this can be achieved using following way:
poetry run uvicorn main:app --reload
--reload if you are running in development mode and this will do the hot deployment
Upvotes: 0
Reputation: 111
Following code works for me
# main.py
import uvicorn
from fastapi import FastAPI
app = FastAPI()
if __name__ == "__main__":
uvicorn.run("main:app", workers=2)
Upvotes: 2
Reputation: 2626
Just as the error message says, do
uvicorn.run("app")
Note also using reload and workers is useless and will just use the reloader. These flags are mutually exclusive
Upvotes: 4
Reputation: 9798
I found the solution to this problem. See below:
In pyproject.toml
[tool.poetry.scripts]
start = "my_package.main:start"
In your main.py
inside my_package
folder.
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)
Upvotes: 65
Reputation: 2257
WARNING: You must pass the application as an import string to enable 'reload' or 'workers'.
try using the same way to run a basic script i.e file:variable
ERROR: Error loading ASGI app. Import string "app" must be in format ":".
uvicorn.run("backend.main:app", host="0.0.0.0", port=8000, reload=True, workers=2)
Upvotes: 2
Reputation: 12762
You will need to pass the module path (module:function
) to the start
script in project.toml
:
[tool.poetry.scripts]
start = "app:main"
Now run the command below will call the main
function in the app
module:
$ poetry run start
Upvotes: 8