2011-02-08 16 views
74

Ogni volta che leggo WSGI o CGI ho rabbrividire. Ho provato a leggere su di esso prima, ma nulla è davvero bloccato.Cosa sono WSGI e CGI in inglese semplice?

Che cosa è veramente in inglese semplice?

Semplicemente convoglia le richieste a un terminale e reindirizza l'output?

+2

http://stackoverflow.com/questions/219110/how-python-web-frameworks-wsgi-and-cgi-fit-together –

risposta

43

WSGI esegue l'interprete Python all'avvio del server Web, come parte del processo del server Web (modalità incorporata) o come processo separato (modalità daemon) e carica lo script in esso. Ogni richiesta risulta in una funzione specifica nello script che viene chiamato, con l'ambiente di richiesta passato come argomenti alla funzione.

CGI esegue lo script come processo separato ogni richiesta e utilizza variabili di ambiente, stdin e stdout per "comunicare" con esso.

+9

WSGI! = Mod_wsgi. La tua lingua suggerisce che intendi mod_wsgi che è un'implementazione di WSGI. WSGI è semplicemente una specifica e può essere implementato in molti modi diversi, incluso in cima al CGI. –

+0

@Graham: stai dicendo che non ci sono altri contenitori WSGI che supportano l'esecuzione di app WSGI in queste modalità? –

+2

Tecnicamente si potrebbe dire che ci sono variazioni più sottili di queste due, almeno per quanto riguarda l'avvio dei processi o l'attivazione del codice all'interno di un sistema embedded. Quindi bisogna solo stare attenti a generalizzare le cose in queste sole due categorie. Ad un livello grossolano potresti dire quello che hai, ma c'è molto di più in questo se vuoi approfondire. –

13

Sia CGI che WSGI definiscono le interfacce standard che i programmi possono utilizzare per gestire le richieste Web. L'interfaccia CGI si trova a un livello inferiore rispetto a WSGI e include il server che imposta le variabili di ambiente contenenti i dati dalla richiesta HTTP, con il programma che restituisce qualcosa formattato come una semplice risposta del server HTTP.

WSGI, d'altra parte, è un'interfaccia specifica per Python, di livello leggermente più elevato che consente ai programmatori di scrivere applicazioni che sono indipendenti dal server e che possono essere incluse in altre applicazioni WSGI (middleware).

173

Da un punto totalmente step-back di vista, Blankman, qui è il mio "Intro pagina" per Web Services Gateway Interface:

PARTE PRIMA: SERVER WEB

server Web servono risposte. Si siedono intorno, aspettando pazientemente, e poi senza alcun preavviso, improvvisamente:

  • un processo client invia una richiesta. Il processo client potrebbe essere un server web, un bot, un'app mobile, qualunque cosa. E 'semplicemente "il cliente"
  • il web server riceve la richiesta accadono
  • deliberate mumble varie cose (vedi sotto)
  • Il server web restituisce qualcosa al cliente
  • web server si trova in giro di nuovo

I server Web (almeno quelli migliori) sono MOLTO bravi in ​​questo. Esse aumentano e diminuiscono l'elaborazione a seconda della domanda, gestiscono in modo affidabile le conversazioni con i clienti più raffinati su reti davvero crude e non ci dobbiamo mai preoccupare. Continuano a servire.

Questo è il mio punto: i server Web sono proprio questo: i server. Non sanno nulla del contenuto, nulla degli utenti, niente di fatto tranne il modo di aspettare molto e rispondere in modo affidabile.

La scelta del server Web deve riflettere le preferenze di consegna, non il software. Il tuo server web dovrebbe essere responsabile del servizio, non dell'elaborazione o delle cose logiche.

PARTE SECONDA: (Python) SOFTWARE

Software non si siede intorno. Il software esiste solo al momento dell'esecuzione. Il software non è molto accomodante quando si tratta di cambiamenti imprevisti nel suo ambiente (i file non sono quelli in cui si aspetta, i parametri vengono rinominati, ecc.). Sebbene l'ottimizzazione dovrebbe essere un principio centrale del tuo design (ovviamente), il software stesso non si ottimizza. Gli sviluppatori ottimizzano. Il software viene eseguito. Il software fa tutto nella sezione "mormora intenzionalmente" sopra. Potrebbe essere qualsiasi cosa

La scelta o la struttura del software dovrebbero riflettere la vostra applicazione, la vostra scelta di funzionalità e non la vostra scelta di server web.

Qui è dove il metodo tradizionale di "compilazione in" lingue per server Web diventa doloroso. Si finisce col mettere il codice nella propria applicazione per far fronte all'ambiente del server fisico o, almeno, essere costretti a scegliere una libreria "wrapper" appropriata da includere a runtime, per dare l'illusione di uniformità tra i server web.

COSA SIGNIFICA WSGI?

Quindi, infine, cos'è WSGI? WSGI è un insieme di regole, scritto in due metà. Sono scritti in modo tale da poter essere integrati in qualsiasi ambiente che accolga l'integrazione.

La prima parte, scritta per il lato server Web, dice "OK, se vuoi gestire un'applicazione WSGI, ecco come il software penserà quando verrà caricato. Ecco le cose che devi rendere disponibili al applicazione, ed ecco l'interfaccia (layout) che puoi aspettarti che ogni applicazione abbia. Inoltre, se qualcosa va storto, ecco come l'app penserà e come ti aspetti che si comporti. "

La seconda parte, scritta per il software applicativo Python, dice "OK, se vuoi gestire un server WSGI, ecco come il server penserà quando ti contatterà. Ecco le cose che devi rendere disponibili per il server, e qui c'è l'interfaccia (layout) che puoi aspettarti da ogni server.Inoltre, se qualcosa va storto, ecco come dovresti comportarti ed ecco cosa dovresti dire al server. "

Così ce l'hai - i server saranno server e il software sarà software, ed ecco un modo in cui possono andare avanti semplicemente alla grande senza dover fare sconti per le specifiche dell'altro. Questo è WSGI.

mod_wsgi, d'altra parte, è un plugin per Apache che gli permette di parlare con il software WSGI-compatibile, in altre parole, mod_wsgi è un implementazione - in Apache - delle regole di una parte uno dei libro delle regole di cui sopra .

Per quanto riguarda CGI .... chiedere a qualcun altro :-)

+7

Piuttosto che lasciare che questa risposta finisca con "chiedi a qualcun altro", vorrei che qualcuno modificasse questa risposta per includere CGI nello stesso modo. –

12

Se non sono chiare su tutti i termini in questo spazio, e diciamocelo, è un confuso un acronimo carichi, c'è anche una buona lettore di sottofondo sotto forma di official python HOWTO che discute CGI contro FastCGI vs WSGI e così via. Vorrei averlo letto prima.

+0

Questo link è ora morto :( – ShankarG

+1

https://docs.python.org/2/howto/webservers.html funziona proprio ora. – Scott