Comment Python Web frameworks, WSGI et CGI s'articulent

j'ai un compte Bluehost où je peux exécuter des scripts Python en tant que CGI. Je suppose que C'est le CGI le plus simple, parce que pour exécuter je dois définir ce qui suit dans .htaccess :

Options +ExecCGI
AddType text/html py
AddHandler cgi-script .py

maintenant, chaque fois que je regarde la programmation web avec Python, j'entends beaucoup parler de WSGI et comment la plupart des frameworks l'utilisent. Mais je ne comprends pas comment tout cela s'intègre, surtout quand mon serveur web est donné (Apache tournant sur la machine d'un hôte) et non quelque chose que je peux vraiment jouer avec (sauf définir les commandes .htaccess ).

comment sont WSGI , CGI, et les cadres tous connectés? Que dois-je savoir, installer et faire si je veux lancer un framework web (par exemple web.py ou CherryPy ) sur ma configuration CGI de base? Comment installer le support WSGI?

141
demandé sur Peter Mortensen 2008-10-20 20:43:57

5 réponses

Comment WSGI, CGI, et les cadres sont tous connectés?

Apache écoute sur le port 80. Il reçoit une requête HTTP. Il analyse la demande de trouver un moyen de répondre. Apache a beaucoup de choix pour répondre. Une façon de répondre est d'utiliser CGI pour exécuter un script. Une autre façon de répondre est de simplement signifier un fichier.

dans le cas de CGI, Apache prépare un environnement et invoque le script via le CGI protocole. Il s'agit d'une situation Unix Fork/Exec standard -- le sous-processus CGI hérite d'un environnement OS incluant la socket et stdout. Le sous-processus CGI écrit une réponse, qui remonte à Apache; Apache envoie cette réponse au navigateur.

CGI est primitif et ennuyeux. Principalement parce qu'il bifurque un sous-processus pour chaque requête, et le sous-processus doit sortir ou fermer stdout et stderr pour signifier la fin de la réponse.

WSGI est une interface qui est basé sur le modèle de conception CGI. Il ne s'agit pas nécessairement de CGI -- il n'est pas nécessaire de bifurquer un sous-processus pour chaque requête. Ça peut être CGI, mais ça n'a pas à l'être.

WSGI ajoute à la conception CGI de plusieurs façons importantes. Il analyse les en-têtes de requête HTTP pour vous et les ajoute à l'environnement. Il fournit n'importe quelle entrée POST-orientée comme un objet de type fichier dans l'environnement. Il vous fournit également une fonction qui formulera la réponse, vous sauvant d'un beaucoup de détails de formatage.

Que dois-je savoir / Installer / faire si je veux lancer un framework web (dire web.py ou cherrypy) sur ma configuration CGI de base?

rappelons que bifurquer un sous-processus coûte cher. Il y a deux façons de contourner cela.

  1. Embedded mod_wsgi ou mod_python intègre Python à l'intérieur de Apache; aucun processus n'est fourchue. Apache exécute directement L'application Django.

  2. démon mod_wsgi ou mod_fastcgi permet à Apache d'interagir avec un démon séparé (ou" long-running process"), en utilisant le protocole WSGI. Vous démarrez votre processus Django de longue date, puis vous configurez mod_fastcgi D'Apache pour communiquer avec ce processus.

notez que mod_wsgi peut fonctionner dans l'un ou l'autre des modes: embedded ou démon.

lorsque vous lisez sur mod_fastcgi, vous verrez que Django utilise flup pour créer une interface compatible WSGI à partir des informations fournies par mod_fastcgi. Le pipeline fonctionne comme ça.

Apache -> mod_fastcgi -> FLUP (via FastCGI protocol) -> Django (via WSGI protocol)

Django a plusieurs "django.core.gestionnaires" pour les différentes interfaces.

pour mod_fastcgi, Django fournit un manage.py runfcgi qui intègre FLUP et le gestionnaire.

pour mod_wsgi, il y a un gestionnaire de base pour ça.

comment installer le support WSGI?

suivez ces instructions.

https://code.google.com/archive/p/modwsgi/wikis/IntegrationWithDjango.wiki

pour plus de détails, voir

http://docs.djangoproject.com/en/dev/howto/deployment/#howto-deployment-index

227
répondu S.Lott 2017-09-10 14:43:15

je pense Florian réponse réponses de la partie de votre question au sujet de "qu'est-ce que WSGI", surtout si vous lisez PEP .

quant aux questions que vous posez vers la fin:

WSGI, CGI, FastCGI etc. sont tous les protocoles pour un serveur web à exécuter le code , et de livrer le contenu dynamique qui est produit. Comparez ceci à un service Web statique, où un fichier HTML simple est essentiellement livré tel quel au client.

CGI, FastCGI et SCGI de langue sont agnostiques. vous pouvez écrire des scripts CGI en Perl, Python, C, bash, n'importe quoi. CGI définit qui exécutable sera appelé, sur la base de l'URL, et comment il sera appelé: les arguments et l'environnement. Il définit également comment la valeur de retour doit être transmise au serveur web une fois que votre exécutable est terminé. Le les variations sont essentiellement des optimisations pour pouvoir traiter plus de requêtes, réduire la latence et ainsi de suite; le concept de base est le même.

WSGI est Python. plutôt qu'un protocole de langage agnostique, une fonction de signature standard est définie:

def simple_app(environ, start_response):
    """Simplest possible application object"""
    status = '200 OK'
    response_headers = [('Content-type','text/plain')]
    start_response(status, response_headers)
    return ['Hello world!\n']

qui est une demande WSGI complète (si limitée). Un serveur web avec le support WSGI (comme Apache avec mod_wsgi) peut invoquer cette fonction chaque fois qu'une requête arrive.

la raison pour laquelle c'est si génial, c'est que nous pouvons éviter l'étape confuse de la conversion D'un HTTP GET/POST à CGI en Python, et revenir à nouveau sur le chemin de la sortie. C'est un lien beaucoup plus direct, propre et efficace.

cela rend également beaucoup plus facile d'avoir des cadres de longue durée fonctionnant derrière des serveurs web, si tout ce qui doit être fait pour une demande est un appel de fonction. Avec un CGI simple, vous devez démarrer votre cadre complet pour chaque demande individuelle.

pour avoir le support WSGI, vous devez avoir installé un module WSGI (comme mod_wsgi ), ou utiliser un serveur web avec WSGI cuit in (comme CherryPy ). Si ni L'un ni l'autre n'est possible, vous pourrait utiliser le pont CGI-WSGI donné dans le PEP.

54
répondu James Brady 2017-05-23 12:17:38

vous pouvez exécuter WSGI sur CGI comme Pep333 démontre comme un exemple. Cependant, chaque fois qu'il y a une requête, Un nouvel interpréteur Python est lancé et le contexte complet (connexions de base de données, etc.) est activé.) doit être construit qui tous prennent du temps.

le mieux si vous voulez lancer WSGI serait que votre hôte installe mod_wsgi et fasse une configuration appropriée pour reporter le contrôle à une de vos applications.

Flup est une autre façon de courir avec WSGI pour n'importe quel serveur web qui parle FCGI , SCGI ou AJP. D'après mon expérience, seul FCGI fonctionne réellement, et il peut être utilisé dans Apache via mod_fastcgi ou si vous pouvez exécuter un démon Python séparé avec mod_proxy_fcgi .

WSGI est un protocole similaire à CGI, qui définit ensemble de règles comment le serveur web et le code Python peuvent interagir, il est défini comme Pep333 . Cela permet à de nombreux serveurs web différents d'utiliser de nombreux cadres et applications différents en utilisant le même protocole d'application. C'est très bénéfique et ça rend ça très utile.

21
répondu Florian Bösch 2011-06-11 18:19:42

si vous n'êtes pas clair sur tous les termes de cet espace, et si vous le permettez, c'est un acronyme confus-chargé, il y a aussi un bon lecteur de fond sous la forme d'un HOWTO python officiel qui traite de CGI vs. FastCGI vs. WSGI et ainsi de suite: http://docs.python.org/howto/webservers.html

6
répondu Richard Boardman 2012-03-29 20:04:51

c'est une simple couche d'abstraction pour Python, semblable à ce que la spécification Servlet est pour Java. Alors que CGI est vraiment bas niveau et ne fait que balancer des trucs dans l'environnement process et standard in/out, les deux spécifications ci-dessus modélisent la requête et la réponse http comme des constructions dans le langage. Mon impression est cependant qu'en Python les gens n'ont pas tout à fait réglé sur les implémentations de facto donc vous avez un mélange d'implémentations de référence, et d'autres bibliothèques de type utilitaire qui fournissent d'autres choses. avec le support WSGI (par ex. Paste). Bien sûr que je peux me tromper, je suis un nouveau venu en Python. La communauté des "scripts web" s'attaque au problème dans une direction différente (hébergement partagé, héritage CGI, préoccupations de séparation des privilèges) que les gens de Java ont eu le luxe de commencer avec (exécuter un conteneur d'entreprise unique dans un environnement dédié contre code compilé et déployé statiquement).

4
répondu aaron 2009-02-05 21:48:33