Sin que todos lo supieran, el 12 de mayo de 2021, se lanzó una nueva versión del famoso microframework Flask. Aunque parecía que Flask ya lo tiene todo, bueno, casi todo lo que se necesita para un microframework.
Anticipando el interés y las novedades, dejaré un enlace al registro de cambios .
De las características de venta de la nueva versión:
Se eliminó la compatibilidad con Python versión 2. Mínimo Python 3.6
Soporte para vistas asincrónicas y otras devoluciones de llamada, como controladores de errores definidos con async def. Las vistas sincrónicas regulares siguen funcionando sin cambios. No se admiten funciones ASGI como websockets.
Agregue decoradores de ruta para métodos comunes de API HTTP.
@ app.post ("/ login") == @ app.route ("/ login", métodos = ["POST"])
Nueva función Config.from_file para cargar la configuración desde cualquier formato de archivo.
El comando flask shell activa la finalización de tabulación como lo hace un shell de Python normal.
Al entregar archivos estáticos, los navegadores almacenarán en caché según el contenido en lugar de según un temporizador de 12 horas. Esto significa que los cambios en el contenido estático, como los estilos CSS, se reflejarán inmediatamente en la recarga sin tener que borrar el caché.
Considere la asincronía
Todo estaría bien, pero al principio, después de la instalación, no se encontró el módulo asgiref. Lo instalaremos a mano.
Por ejemplo, escribamos la aplicación más simple: Ping / Pong. No tiene mucho sentido y lógica compleja, solo imita algún cheque si el servicio está vivo. Además, esta aplicación se convertirá en un referente.
from flask import Flask
app = Flask(__name__)
@app.get('/')
async def ping():
return {'message': 'pong'}
if __name__ == '__main__':
app.run(host='0.0.0.0')
Desplegar
Como decía el registro de cambios: "Las funciones ASGI, como los websockets, no son compatibles".
Es decir, la única forma de implementar una aplicación es utilizando gunicorn.
: gunicorn -w 8 --bind 0.0.0.0:5000 app:app
-w 8 - 8
--bind 0.0.0.0:5000 -
: wrk -t 8 -c 100 -d 5 http://localhost:5000
Flask 2.0:
Running 5s test @ http://localhost:5000
8 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 17.80ms 2.37ms 36.95ms 91.92%
Req/Sec 673.44 163.80 3.86k 99.75%
26891 requests in 5.10s, 4.21MB read
Requests/sec: 5273.84
Transfer/sec: 844.69KB
Flask 2.0:
Running 5s test @ http://localhost:5000
8 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 4.91ms 842.62us 21.56ms 89.86%
Req/Sec 2.38k 410.20 7.64k 93.53%
95301 requests in 5.10s, 14.91MB read
Requests/sec: 18689.25
Transfer/sec: 2.92MB
Flask 1.1.2:
Running 5s test @ http://localhost:5000
8 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 4.98ms 823.42us 17.40ms 88.55%
Req/Sec 2.37k 505.28 12.23k 98.50%
94522 requests in 5.10s, 14.78MB read
Requests/sec: 18537.84
Transfer/sec: 2.90MB
, 1 2 ( ). Flask 2.0 , dev view . ASGI , uvicorn. .
major , . , . Flask, , Django.
Si tiene alguna idea de por qué se obtuvieron estos resultados, compártala en los comentarios.