Lorsque l'on déploie des applications web en Python, comme Django, elles utilisent généralement le protocole WSGI pour s'intégrer avec les serveurs web. Ces serveurs sont généralement basés sur des multiplexeurs de threads, ce qui signifie que chaque requête réseau est traitée dans un thread séparé.
Scénarios de mise en œuvre
Deux types principaux d'applications nécessitent une attention particulière :
- Grand nombre d'utilisateurs : Par exemple, des opérations de flash d'achat, des achats en ligne pendant les soldes ou la réservation de billets de train pendant Noël.
- Nombre élevé de connexions HTTP persistantes : Utilisation d'une même connexion TCP pour envoyer et recevoir plusieurs requêtes/ réponses HTTP au lieu d'ouvrir une nouvelle connexion pour chaque échange.
Le problème C10K
Le concept de C10K (Concurrent Connections) décrit la difficulté à gérer plus de 10 000 connexions simultanées sur une seule machine. Pour pallier à cet problème, Tornado a été conçu pour offrir une solution haute performance.
Présentation de Tornado
Qu'est-ce que Tornado?
Tornado est un serveur web et un cadre de développement web en Python, développé par FriendFeed et maintenant hébergé sur GitHub. Il est célèbre pour sa capacité à traiter un grand nombre de connexinos simultanées grâce à son approche asynchrone.
Comparaison avec Django
| Caractéristique | Django | Tornado |
|---|---|---|
| Approche | Grand et complet | léger et performant |
| Fonctionnalités clés | Administration automatique, ORM | Serveur HTTP, programmation asynchrone, WebSockets |
Introduction à Tornado
Installation
Utilisez pip pour installer Tornado :
class AccueilHandler(tornado.web.RequestHandler): """Classe principale pour la route racine""" def get(self): """Méthode pour traiter les requêtes GET""" self.write("Bonjour Itcast!")
if name == "main": app = tornado.web.Application([ (r"/", AccueilHandler), ]) app.listen(8000) tornado.ioloop.IOLoop.current().start()
</div>Présentation des modules principaux
-----------------------------------
- **tornado.web** : Module de base pour les applications web
- **tornado.ioloop** : Module central pour la boucle d'entrée/sortie asynchrone
- **tornado.httpserver** : Implémentation du serveur HTTP
- **tornado.options** : Gestion des options de ligne de commande
Utilisation avancée de Tornado
==============================
Gestion des options
-------------------
Utilisez **tornado.options** pour définir des paramètres :
<div><div></div>```
import tornado.options
tornado.options.define("port", default=8000, type=int, help="Port d'écoute du serveur.")
Créez un serveur HTTP personnalisé :
app = Application([...]) http_server = HTTPServer(app) http_server.bind(8000) http_server.start(0)
</div>Développement avancé
====================
Gestion des requêtes et des réponses
------------------------------------
Utilisez **RequestHandler** pour gérer les requêtes et les réponses :
<div><div></div>```
class MonHandler(RequestHandler):
def get(self):
self.write("Réponse personnalisée")
Surchargez write_error pour personnaliser les réponses d'erreur :
</div>Préparation et finalisation des requêtes
----------------------------------------
Utilisez **prepare** et **on\_finish** pour des opérations avant et après traitement de la requête :
<div><div></div>```
class MonHandler(RequestHandler):
def prepare(self):
print("Préparation de la requête")
def on_finish(self):
print("Fin de la requête")