Asynchronous programming allows you to handle tasks concurrently, improving performance for I/O-bound operations like database queries and external API calls. Flask, starting from version 2.0, supports asynchronous views and tasks.
In this article, we will explore async views and working with asynchronous tasks in Flask with practical examples.
Flask's support for asynchronous views requires Python 3.7 or higher. First, install Flask:
pip install flask
Create a basic Flask app:
from flask import Flask import asyncio app = Flask(__name__) @app.route('/async-view') async def async_view(): await asyncio.sleep(2) # Simulate an async operation return "This is an asynchronous response!" if __name__ == "__main__": app.run(debug=True)
This example includes an asynchronous view that simulates a delay using asyncio.sleep
.
Run the Flask app and visit /async-view
in your browser. The response will be delayed by 2 seconds, demonstrating asynchronous behavior.
Integrate an asynchronous library like httpx
for making HTTP requests:
pip install httpx
Update your Flask app to include an async API call:
import httpx @app.route('/fetch-data') async def fetch_data(): async with httpx.AsyncClient() as client: response = await client.get('https://jsonplaceholder.typicode.com/posts/1') data = response.json() return data
This view fetches data asynchronously from a placeholder API and returns the response.
Asynchronous tasks often involve running operations outside of the request-response cycle. You can use asyncio.create_task
for this:
tasks = [] @app.route('/start-task') async def start_task(): task = asyncio.create_task(background_task()) tasks.append(task) return "Task started!" async def background_task(): await asyncio.sleep(5) print("Background task completed!")
Access /start-task
to start a background task. The task runs independently without blocking the request-response cycle.
You can mix synchronous and asynchronous views in the same Flask app. Flask automatically handles the integration:
@app.route('/sync-view') def sync_view(): return "This is a synchronous view!" @app.route('/async-mixed') async def async_mixed(): await asyncio.sleep(1) return "This is an async view in a mixed app!"
Flask's asynchronous capabilities enable you to handle concurrent tasks efficiently, especially for I/O-bound operations. By integrating async views and background tasks, you can build highly performant Flask applications.