Frage

Ich habe ein Konto, wo ich Python-Skripte als CGI ausgeführt werden kann. Ich denke, es ist die einfachste CGI, da zu laufen ich folgende in .htaccess definieren:

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

Nun, wenn ich Web-Programmierung mit Python nachschlagen, ich höre viel über WSGI und wie die meisten Frameworks verwenden. Aber ich verstehe einfach nicht, wie alles zusammen passt, vor allem, wenn mein Web-Server gegeben ist (Apache auf einem Host-Computer ausgeführt wird) und nicht etwas, was ich kann wirklich spielen mit (mit Ausnahme der Definition .htaccess Befehle).

Wie werden WSGI , CGI, und den Rahmen alle miteinander verbunden? Was muss ich wissen, installieren und tun, wenn ich einen Web-Framework ausgeführt werden soll (zB web.py oder < a href = "http://en.wikipedia.org/wiki/CherryPy" rel = "noreferrer"> CherryPy ) auf meiner grundlegenden CGI-Konfiguration? Wie WSGI Unterstützung installieren?

War es hilfreich?

Lösung

Wie WSGI, CGI, und die Gerüste sind alle miteinander verbunden?

Apache lauscht auf Port 80. Es wird eine HTTP-Anfrage. Es analysiert die Anfrage einen Weg zu finden, zu reagieren. Apache hat eine Menge Möglichkeiten für die Beantwortung. Eine Möglichkeit, zu reagieren, ist CGI zu verwenden, um ein Skript auszuführen. Eine weitere Möglichkeit, zu reagieren, ist einfach eine Datei zu dienen.

Im Fall von CGI, bereitet Apache eine Umgebung, und ruft das Skript durch das CGI-Protokoll. Dies ist eine Standard-Unix-fork / exec Situation - die CGI subprocess erbt die Buchse und stdout eine OS-Umgebung einschließlich. Die CGI subprocess schreibt eine Antwort, die auf Apache geht zurück; Apache sendet diese Antwort an den Browser.

CGI ist primitiv und ärgerlich. Vor allem, weil es eine subprocess für jede Anfrage Gabeln und subprocess muß oder in der Nähe stdout verlassen und stderr Ende Reaktion bedeuten.

WSGI ist eine Schnittstelle, die auf dem CGI-Entwurfsmuster basiert. Es ist nicht unbedingt CGI - es ist nicht ein Subprozess für jede Anforderung Gabel hat. Es kann CGI sein, aber es muss nicht sein.

WSGI fügt die CGI-Entwurfsmuster in mehreren wichtigen Punkten. Es analysiert die HTTP-Request-Header für Sie und fügt diese in die Umwelt. Es liefert jede POST orientierte Eingabe als Datei-ähnliche Objekt in der Umgebung. Es bietet Ihnen auch eine Funktion, die die Antwort formulieren wird, können Sie aus vielen Formatierungsdetails zu speichern.

Was muss ich wissen / install / tun, wenn ich einen Web-Framework ausgeführt werden soll (zB web.py oder cherrypy) auf meinem Grund CGI-Konfiguration?

Daran erinnern, dass ein subprocess Forking teuer ist. Es gibt zwei Möglichkeiten, dies zu umgehen.

  1. Embedded mod_wsgi oder mod_python bettet Python innerhalb Apache; kein Prozess gegabelt. Apache läuft die Django-Anwendung direkt.

  2. Daemon mod_wsgi oder mod_fastcgi Apache erlaubt mit einem separaten Daemon (oder "lang andauernden Prozess"), mit dem WSGI Protokoll zu interagieren. Sie starten Ihren lang laufende Django Prozess, dann konfigurieren Sie Apache mod_fastcgi mit diesem Prozess zu kommunizieren.

Beachten Sie, dass mod_wsgi kann in beiden Modi arbeiten:. Eingebettet oder Daemon

Wenn Sie auf mod_fastcgi lesen, werden Sie sehen, dass Django verwendet flup zu erstellen ein WSGI-kompatible Schnittstelle aus den Informationen von mod_fastcgi vorgesehen. Die Pipeline funktioniert wie folgt.

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

Django hat mehr "django.core.handlers" für die verschiedenen Schnittstellen.

Für mod_fastcgi, Django bietet eine manage.py runfcgi die FLUP und den Handler integriert.

Für mod_wsgi gibt es einen Core-Handler für diese.

Wie WSGI Unterstützung installieren?

Folgen Sie

Sie diese Anweisungen.

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

Hintergrund sieht diese

http://docs.djangoproject.com/en / dev / Howto / deployment / # howto-Deployment-Index

Andere Tipps

Ich denke, Florian Antwort beantwortet den Teil Ihrer Frage „was ist WSGI“, vor allem, wenn Sie PEP lesen .

Wie für die Fragen, die Sie gegen Ende stellen:

WSGI, CGI, FastCGI usw. sind alle Protokolle für einen Webserver zu Code ausführen , und liefern den dynamischen Inhalt, der produziert wird. Vergleichen Sie dies mit statischem Web-serving, wo eine einfache HTML-Datei im Grunde geliefert wird wie an den Client.

CGI, FastCGI und SCGI ist sprachunabhängig. Sie können CGI-Skripte in Perl, Python, C, bash, was auch immer schreiben. CGI definiert , die ausführbare Datei aufgerufen wird, basierend auf der URL, und wie wird es heißen: die Argumente und Umwelt. Es definiert auch, wie der Rückgabewert auf den Webserver werden sollte, sobald die ausführbare Datei beendet ist zurückgeleitet. Die Variationen sind im Prinzip in der Lage sein Optimierungen mehr Anfragen zu handhaben, die Latenz reduzieren und so weiter; Das Grundkonzept ist das gleiche.

WSGI ist Python nur Anstatt einer Sprache Agnostiker Protokoll, eine Standardfunktion Signatur definiert.

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

Das ist eine komplett (wenn auch begrenzte) WSGI Anwendung. Ein Webserver mit WSGI Unterstützung (wie Apache mit mod_wsgi) kann diese Funktion aufrufen, wenn eine Anfrage kommt.

Der Grund, warum dies so groß ist, dass wir den chaotischen Schritt der Umwandlung von einem HTTP GET / POST CGI zu Python vermeiden können, und mich auf dem Weg wieder zurück. Es ist eine viel direktere, saubere und effiziente Verknüpfung.

Es macht es auch viel einfacher, mit langer Laufzeit-Frameworks zu haben, hinter Web-Servern ausgeführt wird, wenn alles, was für eine Anforderung getan werden muss, ist ein Funktionsaufruf. Mit einem normalen CGI, dann würden Sie müssen starten Sie Ihre gesamten Rahmen bis für jede einzelne Anfrage.

WSGI Unterstützung zu haben, müssen Sie eine WSGI-Modul installiert haben (wie mod_wsgi ) oder einen Web-Server mit WSGI verwenden gebacken (wie CherryPy ). Wenn keiner von denen möglich ist, können Sie könnte die CGI-WSGI-Brücke in dem PEP gegeben verwenden.

Sie können WSGI über CGI laufen als Pep333 demonstriert als Beispiel. jedes Mal, aber es ist eine Anforderung, ein neuer Python-Interpreter gestartet wird und der gesamte Kontext (Datenbankverbindungen, etc.) muss bauen werden, die alle Zeit in Anspruch nehmen.

Die besten, wenn Sie WSGI wäre, wenn Ihr Host mod_wsgi installieren würde ausgeführt werden soll und eine entsprechende Konfiguration vorgenommen Steuerung einer Anwendung von Ihnen zu verschieben.

Flup ist eine andere Art und Weise mit WSGI für jeden Webserver auszuführen, die FCGI , mod_fastcgi oder wenn Sie einen separaten Python-Daemon mit mod_proxy_fcgi laufen kann.

WSGI ist ein Protokoll, ähnlich wie CGI, die eine Reihe von Regeln definiert, wie Webserver und Python-Code in Wechselwirkung treten kann, ist es definiert als Pep333 . Es macht es möglich, dass viele verschiedene webservers viele verschiedene Frameworks und Anwendungen mit dem gleichen Anwendungsprotokoll verwenden können. Dies ist sehr vorteilhaft und macht es so nützlich.

Wenn Sie alle Bedingungen in diesem Raum unklar sind, und lassen ehrlich, es ist eine verwirrende Akronym beladene ein, gibt es auch einen guten Hintergrund Leser in Form eines offiziellen Python 's gemacht, die CGI diskutiert vs. FastCGI vs. WSGI und so an: http://docs.python.org/howto/webservers.html

Es ist eine einfache Abstraktionsschicht für Python, ähnlich zu dem, was die Servlet-Spezifikation ist für Java. Während CGI ist wirklich niedriges Niveau und nur Dumps Sachen in die Prozessumgebung und Standard-in / out, das beide oben genannten Spezifikationen Modell der HTTP-Anfrage und Antwort als Konstrukte in der Sprache. Mein Eindruck ist jedoch, dass noch nicht ganz in Python Leuten auf de-facto-Implementierungen angesiedelt, so dass Sie eine Mischung aus Referenzimplementierungen haben und andere Dienstprogramm-Typ-Bibliotheken, die anderen Dinge bieten zusammen mit WSGI Unterstützung (zum Beispiel Einfügen). Natürlich habe ich falsch sein könnte, bin ich ein Neuling in Python. Die „Web-Scripting“ Gemeinschaft ist das Problem aus einer anderen Richtung kommen (Shared Hosting, CGI Erbe, Privilegientrennung betrifft) als Java-Leute mit den Luxus Start hatte (ein einzelnes Unternehmen Container in einer dedizierten Umgebung läuft gegen statisch kompiliert und eingesetzt Code).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top