I have a simple API function as below,
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
I am starting the server using uvicorn
command as,
uvicorn main:app
Since we are not calling any python file directly, it is not possible to call uvicorn
command from Pycharm.
So, How can I run the fast-api server using Pycharm?
Method-1: Run FastAPI by calling uvicorn.run(...)
In this case, your minimal code will be as follows,
# main.py
import uvicorn
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
Normally, you'll start the server by running the following command,
python main.py
Pycharm Setup
For this setup, and now, you can set the script path in Pycharm's config
https://i.stack.imgur.com/SYUcX.png
Notes
Script Path: path to the FastAPI script
Python Interpreter: Choose your interpreter/virtual environment
Working Directory: Your FastAPI project root
Method-2: Run FastAPI by calling uvicorn command
In this case, your minimal code will be as follows,
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
Normally, you'll start the server by running the following command,
uvicorn main:app --reload
Pycharm Setup
For this setup, and now, you can set the script path in Pycharm's config
https://i.stack.imgur.com/6f8xy.png
Notes
Module name: set to uvicorn
[Optional] Script: Path to uvicorn binary. You will get the path by executing the command, which uvicorn , inside your environment. (See this image)
Parameters: The actual parameters of uvicorn command
Python Interpreter: Choose your interpreter/virtual environment
Working Directory: Your FastAPI project root
You can do it without adding code to main.py
In target to run instead of Script path choose Module name In Module name type uvicorn In parameters app.main:app --reload --port 5000
https://i.stack.imgur.com/mMMIb.png
--reload
Try to call uvicorn inside your code. e.g:
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=5000, log_level="info")
Another example, this might be helpful to someone.
# fastapi_demo.py
import uvicorn
from fastapi import FastAPI, Response
app = FastAPI()
@app.route('/', methods=['POST'])
def demo(request):
try:
print(request)
except Exception as e:
print(e)
return Response(content='OK')
if __name__ == '__main__':
uvicorn.run(app='fastapi_demo:app')
reload=True
and it leads to double initialization. To avaid that you must add reload_dirs=['/app_dir_name',]
. But, this approach is not wrong to run app by PyCharm. Check this FYI
uvicorn.run(app)
instead, that'd not start the app twice
Success story sharing
uvicorn.run(...)
supports all the args supported by the commandline