Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/miguelgrinberg/aioflask

Flask running on asyncio!
https://github.com/miguelgrinberg/aioflask

async-await asyncio flask greenlet

Last synced: about 11 hours ago
JSON representation

Flask running on asyncio!

Awesome Lists containing this project

README

        

# aioflask

![Build status](https://github.com/miguelgrinberg/aioflask/workflows/build/badge.svg) [![codecov](https://codecov.io/gh/miguelgrinberg/aioflask/branch/main/graph/badge.svg?token=CDMKF3L0ID)](https://codecov.io/gh/miguelgrinberg/aioflask)

Flask 2.x running on asyncio!

Is there a purpose for this, now that Flask 2.0 is out with support for async
views? Yes! Flask's own support for async handlers is very limited, as the
application still runs inside a WSGI web server, which severely limits
scalability. With aioflask you get a true ASGI application, running in a 100%
async environment.

WARNING: This is an experiment at this point. Not at all production ready!

## Quick start

To use async view functions and other handlers, use the `aioflask` package
instead of `flask`.

The `aioflask.Flask` class is a subclass of `flask.Flask` that changes a few
minor things to help the application run properly under the asyncio loop. In
particular, it overrides the following aspects of the application instance:

- The `route`, `before_request`, `before_first_request`, `after_request`,
`teardown_request`, `teardown_appcontext`, `errorhandler` and `cli.command`
decorators accept coroutines as well as regular functions. The handlers all
run inside an asyncio loop, so when using regular functions, care must be
taken to not block.
- The WSGI callable entry point is replaced with an ASGI equivalent.
- The `run()` method uses uvicorn as web server.

There are also changes outside of the `Flask` class:

- The `flask aiorun` command starts an ASGI application using the uvicorn web
server.
- The `render_template()` and `render_template_string()` functions are
asynchronous and must be awaited.
- The context managers for the Flask application and request contexts are
async.
- The test client and test CLI runner use coroutines.

## Example

```python
import asyncio
from aioflask import Flask, render_template

app = Flask(__name__)

@app.route('/')
async def index():
await asyncio.sleep(1)
return await render_template('index.html')
```