How can I run the fast-api server using Pycharm?
22,637
Solution 1
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
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
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
Solution 2
You can do it without adding code to main.py
- In
target to run
instead ofScript path
chooseModule name
- In
Module name
typeuvicorn
- In parameters
app.main:app --reload --port 5000
Solution 3
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")
![JPG](https://i.stack.imgur.com/YiHgN.jpg?s=256&g=1)
Comments
-
JPG almost 2 years
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?
-
GregH almost 4 yearsThe problem is that you can't deploy to production this way because you can't really pass other parameters to uvicorn...say "workers", etc. At least I can't get it to work.
-
JPG almost 4 yearsAlso, this is not for production. Suppose if you want to update the number of workers, you need to update your code, which is of course not a good idea. That's why unicorn supports the commandline setup.
-
JPG almost 4 yearsBTW, the
uvicorn.run(...)
supports all the args supported by the commandline -
Timothy Mugayi over 3 yearsYou can pass in args via pycharm and dynamically configure uvicorn all args supported via config = Config(app, **kwargs)
-
JPG over 3 yearsCould you explain why that matter here? Sorry that I didn't get your point @TimothyMugayi
-
Tobias Feil about 3 yearsAwesome, couln't find an answer anywhere else on how to debug AND reload at the same time
-
James about 3 yearsThis is the best answer in my opinion as it is the only one that lets you use
--reload
-
Borko Rastović almost 3 yearsI was looking for this solution for the past 2 (two) years now :)
-
mLstudent33 almost 3 yearsIs running on
0.0.0.0
safe? I'm a novice but someone might have told me at some point, "don't do that". I changed it tolocalhost
and it works. -
Coco almost 3 yearsthis results in the fastapi_demo to be run twice. If you have a (for example) global variable it will be initialized
-
Suyog Shimpi almost 3 yearsThanks, @Coco to identify my mistake. It was running twice just because of misconfiguration. Actually, I have added
reload=True
and it leads to double initialization. To avaid that you must addreload_dirs=['/app_dir_name',]
. But, this approach is not wrong to run app by PyCharm. Check this FYI -
Coco over 2 yearsyou would need to run
uvicorn.run(app)
instead, that'd not start the app twice