Serveur HTTP intégré et moteur interne

CherryPy est livré avec son propre serveur Web (HTTP). C'est pourquoi CherryPy est autonome et permet aux utilisateurs d'exécuter une application CherryPy quelques minutes après avoir obtenu la bibliothèque.

le web server agit comme la passerelle vers l'application à l'aide de laquelle toutes les demandes et réponses sont conservées.

Pour démarrer le serveur Web, un utilisateur doit effectuer l'appel suivant -

cherryPy.server.quickstart()

le internal engine of CherryPy est responsable des activités suivantes -

  • Création et gestion des objets de demande et de réponse.
  • Contrôle et gestion du processus CherryPy.

CherryPy - Configuration

Le framework est livré avec son propre système de configuration vous permettant de paramétrer le serveur HTTP. Les paramètres de configuration peuvent être stockés soit dans un fichier texte avec une syntaxe proche du format INI, soit sous forme de dictionnaire Python complet.

Pour configurer l'instance de serveur CherryPy, le développeur doit utiliser la section globale des paramètres.

global_conf = {
   'global': {
      'server.socket_host': 'localhost',
      'server.socket_port': 8080,
   },
}

application_conf = {
   '/style.css': {
      'tools.staticfile.on': True,
      'tools.staticfile.filename': os.path.join(_curdir, 'style.css'),
   }
}

This could be represented in a file like this:
[global]
server.socket_host = "localhost"
server.socket_port = 8080
[/style.css]
tools.staticfile.on = True
tools.staticfile.filename = "/full/path/to.style.css"

Conformité HTTP

CherryPy a évolué lentement mais il inclut la compilation des spécifications HTTP avec le support de HTTP / 1.0 transféré plus tard avec le support de HTTP / 1.1.

CherryPy est censé être conditionnellement conforme à HTTP / 1.1 car il implémente tous les niveaux obligatoires et requis mais pas tous les niveaux devraient de la spécification. Par conséquent, CherryPy prend en charge les fonctionnalités suivantes de HTTP / 1.1 -

  • Si un client prétend prendre en charge HTTP / 1.1, il doit envoyer un champ d'en-tête dans toute demande effectuée avec la version de protocole spécifiée. Si ce n'est pas fait, CherryPy arrêtera immédiatement le traitement de la demande.

  • CherryPy génère un champ d'en-tête Date qui est utilisé dans toutes les configurations.

  • CherryPy peut gérer le code d'état de réponse (100) avec le soutien des clients.

  • Le serveur HTTP intégré de CherryPy prend en charge les connexions persistantes qui sont la valeur par défaut dans HTTP / 1.1, via l'utilisation de l'en-tête Connection: Keep-Alive.

  • CherryPy gère les demandes et les réponses correctement fragmentées.

  • CherryPy prend en charge les demandes de deux manières distinctes - les en-têtes If-Modified-Since et If-Unmodified-Since et envoie des réponses selon les demandes en conséquence.

  • CherryPy autorise n'importe quelle méthode HTTP.

  • CherryPy gère les combinaisons de versions HTTP entre le client et le jeu de paramètres pour le serveur.

Serveur d'applications multithread

CherryPy est conçu sur la base du concept multithreading. Chaque fois qu'un développeur obtient ou définit une valeur dans l'espace de noms CherryPy, cela se fait dans l'environnement multi-thread.

Cherrypy.request et cherrypy.response sont des conteneurs de données de thread, ce qui implique que votre application les appelle indépendamment en sachant quelle requête leur est envoyée par proxy au moment de l'exécution.

Les serveurs d'applications utilisant le modèle de thread ne sont pas très appréciés car l'utilisation de threads est considérée comme augmentant la probabilité de problèmes dus aux exigences de synchronisation.

Les autres alternatives incluent -

Modèle multi-processus

Chaque requête est gérée par son propre processus Python. Ici, les performances et la stabilité du serveur peuvent être considérées comme meilleures.

Motif asynchrone

Ici, l'acceptation de nouvelles connexions et le renvoi des données au client se font de manière asynchrone à partir du processus de demande. Cette technique est connue pour son efficacité.

Distribution d'URL

La communauté CherryPy veut être plus flexible et que d'autres solutions pour les répartiteurs seraient appréciées. CherryPy 3 fournit d'autres répartiteurs intégrés et offre un moyen simple d'écrire et d'utiliser vos propres répartiteurs.

  • Applications utilisées pour développer des méthodes HTTP. (GET, POST, PUT, etc.)
  • Celui qui définit les routes dans l'URL - Routes Dispatcher

Répartiteur de méthode HTTP

Dans certaines applications, les URI sont indépendants de l'action, qui doit être effectuée par le serveur sur la ressource.

Par exemple,http://xyz.com/album/delete/10

L'URI contient l'opération que le client souhaite effectuer.

Par défaut, le répartiteur CherryPy serait mappé de la manière suivante -

album.delete(12)

Le répartiteur mentionné ci-dessus est mentionné correctement, mais peut être rendu indépendant de la manière suivante -

http://xyz.com/album/10

L'utilisateur peut se demander comment le serveur distribue la page exacte. Ces informations sont portées par la requête HTTP elle-même. Lorsqu'il y a une demande du client au serveur, CherryPy recherche le meilleur gestionnaire, le gestionnaire est une représentation de la ressource ciblée par l'URI.

DELETE /album/12 HTTP/1.1

Répartiteur d'itinéraires

Voici une liste des paramètres de la méthode requise lors du dispatching -

  • Le paramètre name est le nom unique de la route à connecter.

  • La route est le modèle correspondant aux URI.

  • Le contrôleur est l'instance contenant les gestionnaires de page.

  • L'utilisation du répartiteur de routes connecte un modèle qui correspond aux URI et associe un gestionnaire de page spécifique.

Exemple

Prenons un exemple pour comprendre comment cela fonctionne -

import random
import string
import cherrypy

class StringMaker(object):
   @cherrypy.expose
   def index(self):
      return "Hello! How are you?"
   
   @cherrypy.expose
   def generate(self, length=9):
      return ''.join(random.sample(string.hexdigits, int(length)))
		
if __name__ == '__main__':
   cherrypy.quickstart(StringMaker ())

Suivez les étapes ci-dessous pour obtenir la sortie du code ci-dessus -

Step 1 - Enregistrez le fichier mentionné ci-dessus sous tutRoutes.py.

Step 2 - Visitez l'URL suivante -

http://localhost:8080/generate?length=10

Step 3 - Vous recevrez la sortie suivante -