C'est vivant! Sortie de Flask 2.0

À l'insu de tous, le 12 mai 2021, une nouvelle version du célèbre microframework Flask est sortie. Bien qu'il semble que Flask ait déjà tout, eh bien, presque tout ce qui est nécessaire pour un microframework.

Anticipant l'intérêt, et ce qui est nouveau, je laisserai un lien vers le journal des modifications .





À partir des fonctionnalités de vente de la nouvelle version:

  • Suppression de la prise en charge de Python version 2. Minimum Python 3.6





  • Prise en charge des vues asynchrones et d'autres rappels tels que les gestionnaires d'erreurs définis avec async def. Les vues synchrones régulières continuent de fonctionner sans changement. Les fonctionnalités ASGI telles que les Websockets ne sont pas prises en charge.





  • Ajoutez des décorateurs de route pour les méthodes API HTTP courantes.

    @ app.post ("/ login") == @ app.route ("/ login", methods = ["POST"])





  • Nouvelle fonction Config.from_file pour charger la configuration à partir de n'importe quel format de fichier.





  • La commande flask shell active la complétion des tabulations comme le fait un shell python classique.





  • Lors de la diffusion de fichiers statiques, les navigateurs mettront en cache en fonction du contenu plutôt qu'en fonction d'un minuteur de 12 heures. Cela signifie que les modifications apportées au contenu statique, comme les styles CSS, seront immédiatement reflétées lors du rechargement sans avoir à vider le cache.





Considérez l'asynchronie

Tout irait bien, mais au tout début après l'installation, le module asgiref n'a pas été trouvé. Nous l'installerons à la main.





Par exemple, écrivons l'application la plus simple: Ping / Pong. Il n'a pas beaucoup de sens et de logique complexe, il n'imite que quelques vérifications si le service est en vie. Aussi, cette application deviendra une référence.





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')

      
      



Déployer

Comme le dit le journal des modifications: «Les fonctions ASGI telles que les Websockets ne sont pas prises en charge».

Autrement dit, la seule façon de déployer une application consiste à utiliser 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 vous avez des idées sur les raisons pour lesquelles ces résultats ont été obtenus, veuillez les partager dans les commentaires.








All Articles