FastAPI throws an error (Error loading ASGI app. Could not import module "api")
TL;DR
Add the directory name in front of your filename
uvicorn src.main:app
or cd
into that directory
cd src
uvicorn main:app
Long Answer
It happens because you are not in the same folder with your FastAPI app instance more specifically:
Let's say i have an app-tree like this;
my_fastapi_app/
├── app.yaml
├── docker-compose.yml
├── src
│ └── main.py
└── tests
├── test_xx.py
└── test_yy.py
$ pwd # Present Working Directory
/home/yagiz/Desktop/my_fastapi_app
I'm not inside the same folder with my app instance, so if I try to run my app with uvicorn I'll get an error like yours
$ uvicorn main:app --reload
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [40645] using statreload
ERROR: Error loading ASGI app. Could not import module "main".
The answer is so simple, add the folder name in front of your filename
uvicorn src.main:app --reload
or you can change your working directory
cd src
Now i'm inside of the folder with my app instance
src
└── main.py
Run your uvicorn again
$ uvicorn main:app --reload
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [40726] using statreload
INFO: Started server process [40728]
INFO: Waiting for application startup.
INFO: Application startup complete.
I had the same problem and solved it adding package name before main, in your case trying:
uvicorn src.main:app --reload
may solve the problem
One reason this might be happening is that you are using:
uvicorn src/main:app --reload
instead of the correct syntax:
uvicorn src.main:app --reload
Notice the . instead of the /
That's assuming that (1) your structure is something like this:
project_folder/
├── some_folder
├── src
│ └── main.py
└── tests
├── test_xx.py
└── test_yy.py
(2) that your FastAPI()
object is indeed assigned to an object named app
in main.py
:
app = FastAPI()
(3) you are running the uvicorn command from the project_folder
, e.g.:
(venv) <username>@<pcname>:~/PycharmProjects/project_folder$ uvicorn src.main:app --reload
It seems it is important that you name your file main.py otherwise it won't work.
Edit: Actually I was running Jupyter Notebook on port 8888 so that port was already occupied. If you have to run Jupyter notebook, run it after running the API server, the notebook will automatically run on 8889. Alternatively, you can run the API server on a different port.