¡Está vivo! Lanzamiento del frasco 2.0

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.








All Articles