Search code examples
pythonfastapiuvicorn

FastAPI throws an error (Error loading ASGI app. Could not import module "api")


I tried to run FastAPI using uvicorn webserver but it throws an error.

I run this command,

uvicorn api:app --reload --host 0.0.0.0

but there is an error in the terminal.

Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
Started reloader process [23445]
Error loading ASGI app. Could not import module "api".
Stopping reloader process [23445]

Solution

  • 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.