The Flask extension provides two integration classes for building Dapr applications with Flask: DaprApp for pub/sub subscriptions and DaprActor for actor hosting. It mirrors the FastAPI extension's functionality but uses Flask's routing and request model.
ext/flask_dapr/
├── setup.cfg # Deps: dapr, Flask
├── setup.py
├── tests/
│ └── test_app.py # DaprApp pub/sub tests
└── flask_dapr/
├── __init__.py # Exports: DaprApp, DaprActor
├── app.py # DaprApp — pub/sub subscription handler
├── actor.py # DaprActor — actor runtime HTTP adapter
└── version.py
Note: Unlike other extensions, this package uses flask_dapr as its top-level namespace (not dapr.ext.*).
from flask_dapr import DaprApp, DaprActorWraps a Flask instance to add Dapr pub/sub event handling.
app = Flask('myapp')
dapr_app = DaprApp(app)
@dapr_app.subscribe(pubsub='pubsub', topic='orders', route='/handle-order',
metadata={}, dead_letter_topic=None)
def handle_order():
event_data = request.json
return 'ok'- Auto-registers
GET /dapr/subscribeendpoint - Each
@subscriberegisters a POST route viaadd_url_rule() - Default route:
/events/{pubsub}/{topic} - Handlers use Flask's
requestcontext (not function arguments)
Integrates Dapr's actor runtime with Flask.
app = Flask('actor_service')
dapr_actor = DaprActor(app)
dapr_actor.register_actor(MyActorClass)Auto-registers six endpoints (same as FastAPI extension):
GET /healthz,GET /dapr/configDELETE /actors/{type}/{id}— deactivationPUT /actors/{type}/{id}/method/{method}— method invocationPUT /actors/{type}/{id}/method/timer/{timer},PUT /actors/{type}/{id}/method/remind/{reminder}
Async bridging: Uses asyncio.run() to bridge Flask's synchronous request handling with the async ActorRuntime. Each handler call spawns a new event loop.
Response wrapping (wrap_response): Same pattern as FastAPI extension — string → JSON, bytes → raw, dict → JSON. Error responses include errorCode field.
dapr >= 1.17.0.devFlask >= 1.1
python -m unittest discover -v ./ext/flask_dapr/teststest_app.py— uses Flasktest_client()for HTTP-level testing: subscription registration, custom routes, metadata, dead letter topics
Note: No tests for DaprActor in this extension (unlike FastAPI which tests _wrap_response).
- Synchronous + asyncio bridge: Flask is sync, but
ActorRuntimeis async. The extension usesasyncio.run()for each actor operation. - Different namespace: This is
flask_dapr, notdapr.ext.flask. Import asfrom flask_dapr import DaprApp, DaprActor. - Similar to FastAPI extension: The two extensions have nearly identical functionality. When modifying one, check if the same change is needed in the other.
- Reentrancy ID: Actor method invocation extracts
Dapr-Reentrancy-Idheader, same as FastAPI extension.