When it comes to web development in Python, Flask and FastAPI are two popular frameworks that are commonly used. Flask is a lightweight web framework that is great for building simple web applications, while FastAPI is a modern web framework that is known for its high performance and ease of use. In this tutorial, we will show you how to use Flask with FastAPI, including how to incorporate Flask into a FastAPI project.
Step 1: Install Flask and FastAPI
First, you will need to install Flask and FastAPI. You can do this using pip, the Python package installer. Open a terminal window and run the following commands:
pip install Flask
pip install fastapi
Step 2: Create a basic Flask application
Now, let’s create a basic Flask application. Create a new Python file, for example app.py
, and add the following code:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, Flask!'
Save the file and run the Flask application by executing the following command in the terminal:
flask run
Navigate to http://127.0.0.1:5000/
in your browser, and you should see the message "Hello, Flask!" displayed on the page.
Step 3: Create a FastAPI application
Next, let’s create a FastAPI application. Create a new Python file, for example main.py
, and add the following code:
from fastapi import FastAPI
app = FastAPI()
@app.get('/')
async def hello_world():
return {'message': 'Hello, FastAPI!'}
Save the file and run the FastAPI application by executing the following command in the terminal:
uvicorn main:app --reload
Navigate to http://127.0.0.1:8000/
in your browser, and you should see the message {"message": "Hello, FastAPI!"}
displayed on the page.
Step 4: Incorporate Flask into a FastAPI project
Now, let’s incorporate Flask into a FastAPI project. First, create a new directory for your project and move the app.py
file (Flask application) and the main.py
file (FastAPI application) into that directory.
Next, create a new file called adapter.py
in the project directory and add the following code:
from fastapi import APIRouter
from app import app as flask_app
router = APIRouter()
@router.get('/hello')
def hello():
with flask_app.test_request_context('/hello'):
response = flask_app.full_dispatch_request()
return response.get_data()
In the main.py
file, modify the code to include the adapter.py
file like so:
from fastapi import FastAPI
from adapter import router as flask_router
app = FastAPI()
app.include_router(flask_router)
if __name__ == '__main__':
import uvicorn
uvicorn.run(app, host='127.0.0.1', port=8000)
Now when you run the FastAPI application, you can navigate to http://127.0.0.1:8000/hello
in your browser, and you should see the message "Hello, Flask!" displayed on the page.
In this tutorial, we have shown you how to use Flask with FastAPI and incorporate a Flask application into a FastAPI project. By combining the strengths of both frameworks, you can build powerful and efficient web applications in Python.
Great job 🎉
can you use flask auth/login libraries then to control access to the fastapi endpoints? so for examplle required login decorator
I get : await self.app(scope, receive, send)
TypeError: __call__() takes 3 positional arguments but 4 were given
I have no Idea how to solve it ( I replaced from fastapi.middleware.wsgi import WSGImiddleware by from a2wsgi import ASGIMiddleware , since i got ImportError: cannot import name 'WSGImiddleware' from 'fastapi.middleware.wsgi' (c:usershana amramdocumentsgit-mentavenvlibsite-packagesfastapimiddlewarewsgi.py) for the first one). I have no idea how to solve it. would you help me ?
Tnx
Any idea if fastapi can integrate to share existing flask app with sqalchemy database? Experimented a bit, seems too complicated…
Saved my life brother, thanks a lot
Nice monolith design, thanks for sharing
very helpful! thanks!
Does the Flask profit from the faster FastAPI WSGI?
Interesting video. What would be the posible benefits of embedding flask in fastapi?
Grease and very informative, thanks. What if we want to use flask_forms and render api result in flask mounted section and not in different routes?
Amazing stuff Jesse! Thanks for your quality work!