Was sind WSGI und CGI im Klartext?

126

Jedes Mal, wenn ich WSGI oder CGI lese, schaudere ich. Ich habe schon einmal versucht, darauf zu lesen, aber nichts ist wirklich hängen geblieben.

Was ist es wirklich in einfachem Englisch?

Leitet es nur Anforderungen an ein Terminal weiter und leitet die Ausgabe um?

Blankman
quelle

Antworten:

60

WSGI führt den Python-Interpreter beim Start des Webservers entweder als Teil des Webserverprozesses (eingebetteter Modus) oder als separater Prozess (Dämonmodus) aus und lädt das Skript in diesen. Jede Anforderung führt dazu, dass eine bestimmte Funktion im Skript aufgerufen wird, wobei die Anforderungsumgebung als Argumente an die Funktion übergeben wird.

CGI führt das Skript bei jeder Anforderung als separaten Prozess aus und verwendet Umgebungsvariablen, stdin und stdout, um mit ihm zu "kommunizieren".

Ignacio Vazquez-Abrams
quelle
15
WSGI! = Mod_wsgi. Ihre Sprache schlägt vor, dass Sie mod_wsgi meinen, eine Implementierung von WSGI. WSGI selbst ist lediglich eine Spezifikation und kann auf viele verschiedene Arten implementiert werden, auch zusätzlich zu CGI.
Graham Dumpleton
@Graham: Wollen Sie damit sagen, dass es keine anderen WSGI-Container gibt, die das Ausführen von WSGI-Apps in diesen Modi unterstützen?
Ignacio Vazquez-Abrams
3
Technisch könnte man sagen, dass es subtilere Variationen gibt als nur diese beiden, zumindest in Bezug darauf, wie die Prozesse gestartet werden oder wie Code in einem eingebetteten System aktiviert wird. Man muss also nur vorsichtig sein, um die Dinge in nur diese beiden Kategorien zu verallgemeinern. Auf einer groben Ebene könnten Sie sagen, was Sie haben, aber es steckt noch viel mehr dahinter, wenn Sie sich damit befassen möchten.
Graham Dumpleton
1
@GrahamDumpleton, würde es Ihnen aus Neugier etwas ausmachen zu erklären, wie WSGI zusätzlich zu CGI implementiert werden kann?
Yoland
2
Lesen Sie die WSGI-Spezifikation. Es zeigt eine beispielhafte CGI / WSGI-Brücke. python.org/dev/peps/pep-3333/#the-server-gateway-side Eine robustere Implementierung finden Sie unter github.com/GrahamDumpleton/cgi2wsgi. Im Ernst, im Allgemeinen möchten Sie CGI vermeiden.
Graham Dumpleton
255

Aus einer völlig rückständigen Sicht, Blankman, hier ist meine "Intro-Seite" für die Web Services Gateway-Oberfläche:

ERSTER TEIL: WEB-SERVER

Webserver liefern Antworten. Sie sitzen herum, warten geduldig und dann plötzlich ohne Vorwarnung:

  • Ein Client-Prozess sendet eine Anfrage. Der Client-Prozess kann ein Webserver, ein Bot, eine mobile App sein. Es ist einfach "der Kunde"
  • Der Webserver empfängt diese Anfrage
  • absichtliches murmeln verschiedene dinge passieren (siehe unten)
  • Der Webserver sendet etwas an den Client zurück
  • Webserver sitzt wieder herum

Webserver (zumindest die besseren) sind sehr gut darin. Sie skalieren die Verarbeitung je nach Bedarf nach oben und unten, sie führen zuverlässig Gespräche mit den schuppigsten Kunden über wirklich grobe Netzwerke und wir müssen uns nie wirklich darum kümmern. Sie dienen einfach weiter.

Das ist mein Punkt: Webserver sind genau das: Server. Sie wissen nichts über Inhalte, nichts über Benutzer, nichts anderes als viel zu warten und zuverlässig zu antworten.

Ihre Wahl des Webservers sollte Ihre Lieferpräferenz widerspiegeln, nicht Ihre Software. Ihr Webserver sollte für die Bereitstellung, nicht für die Verarbeitung oder logische Daten zuständig sein.

ZWEITER TEIL: (PYTHON) SOFTWARE

Software sitzt nicht herum. Software existiert nur zur Ausführungszeit. Software ist nicht besonders entgegenkommend, wenn es um unerwartete Änderungen in ihrer Umgebung geht (Dateien befinden sich nicht dort, wo sie erwartet werden, Parameter werden umbenannt usw.). Obwohl die Optimierung (natürlich) ein zentraler Grundsatz Ihres Designs sein sollte, wird die Software selbst nicht optimiert. Entwickler optimieren. Software wird ausgeführt. Die Software erledigt alle Aufgaben im Abschnitt "Absichtliches Murmeln" oben. Könnte alles sein.

Ihre Wahl oder Ihr Design der Software sollte Ihre Anwendung, Ihre Wahl der Funktionalität und nicht Ihre Wahl des Webservers widerspiegeln.

Hier wird die traditionelle Methode des "Kompilierens in" Sprachen auf Webservern schmerzhaft. Am Ende fügen Sie Code in Ihre Anwendung ein, um mit der physischen Serverumgebung fertig zu werden, oder müssen zumindest eine geeignete Wrapper-Bibliothek auswählen, die zur Laufzeit aufgenommen werden soll, um die Illusion einer Einheitlichkeit zwischen den Webservern zu erzeugen.

WAS IST WSGI?

Was ist WSGI? WSGI ist ein Regelwerk , das in zwei Hälften geschrieben ist. Sie sind so geschrieben, dass sie in jede Umgebung integriert werden können, die die Integration begrüßt.

Der erste Teil, der für die Webserverseite geschrieben wurde, lautet: "OK, wenn Sie mit einer WSGI-Anwendung arbeiten möchten, wird die Software beim Laden folgendermaßen denken. Hier sind die Dinge, die Sie der Anwendung zur Verfügung stellen müssen, und hier ist die Benutzeroberfläche (Layout), die Sie von jeder Anwendung erwarten können. Wenn außerdem etwas schief geht, wird die App wie folgt denken und wie sie sich verhalten kann. "

Der zweite Teil, der für die Python-Anwendungssoftware geschrieben wurde, lautet: "OK, wenn Sie mit einem WSGI-Server arbeiten möchten, wird der Server folgendermaßen denken, wenn er Sie kontaktiert. Hier sind die Dinge, die Sie dem Server zur Verfügung stellen müssen, und Hier ist die Schnittstelle (Layout), die Sie von jedem Server erwarten können. Wenn etwas schief geht, sollten Sie sich außerdem so verhalten und dem Server Folgendes mitteilen. "

Da haben Sie es also - Server werden Server sein und Software wird Software sein, und hier ist eine Möglichkeit, wie sie einfach gut miteinander auskommen können, ohne dass einer die Besonderheiten des anderen berücksichtigen muss. Das ist WSGI.

mod_wsgi hingegen ist ein Plugin für Apache, mit dem es mit WSGI-kompatibler Software kommunizieren kann. Mit anderen Worten, mod_wsgi ist in Apache eine Implementierung der Regeln von Teil 1 des obigen Regelwerks.

Was CGI betrifft ... frag jemand anderen :-)

Mark Henwood
quelle
21
Anstatt diese Antwort mit "jemand anderen fragen" enden zu lassen, möchte ich, dass jemand diese Antwort so bearbeitet, dass CGI auf die gleiche Weise eingeschlossen wird.
Bruno Bronosky
1
'Server werden Server sein und Software wird Software sein' - 'Server sind vom Mars und Software ist von Venus' :)
Rahul
22

Wenn Sie sich über alle Begriffe in diesem Bereich nicht sicher sind und es sich um einen verwirrenden, mit Akronymen beladenen handelt, gibt es auch einen guten Hintergrundleser in Form eines offiziellen Python-HOWTO, in dem CGI vs. FastCGI vs. WSGI und so weiter diskutiert wird auf. Ich wünschte, ich würde es zuerst lesen.

Richard Boardman
quelle
21

Sowohl CGI als auch WSGI definieren Standardschnittstellen, über die Programme Webanforderungen bearbeiten können. Die CGI-Schnittstelle befindet sich auf einer niedrigeren Ebene als WSGI und umfasst das Einrichten von Umgebungsvariablen durch den Server, die die Daten aus der HTTP-Anforderung enthalten, wobei das Programm etwas zurückgibt, das so ziemlich wie eine reine HTTP-Serverantwort formatiert ist.

WSGI hingegen ist eine Python-spezifische Schnittstelle auf etwas höherer Ebene, mit der Programmierer Anwendungen schreiben können, die serverunabhängig sind und die in andere WSGI-Anwendungen (Middleware) eingebunden werden können.

Wooble
quelle