Jak frameworki internetowe Pythona, WSGI i CGI pasują do siebie

Mam konto Bluehost , na którym mogę uruchamiać skrypty Pythona jako CGI. To chyba najprostszy CGI, bo żeby uruchomić muszę zdefiniować w .htaccess:

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

Teraz, Kiedy patrzę na programowanie internetowe w Pythonie, słyszę wiele o WSGI i jak większość frameworków z niego korzysta. Ale po prostu nie rozumiem, jak to wszystko pasuje do siebie, zwłaszcza gdy mój serwer WWW jest podany (Apache działa na maszynie hosta), a nie coś, z czym naprawdę mogę grać (z wyjątkiem definiowania .htaccess polecenia).

W Jaki Sposób WSGI , CGI i frameworki są ze sobą połączone? Co muszę wiedzieć, zainstalować i zrobić, jeśli chcę uruchomić framework internetowy (powiedzmy web.py lub CherryPy ) w mojej podstawowej konfiguracji CGI? Jak zainstalować obsługę WSGI?

Author: Peter Mortensen, 2008-10-20

5 answers

Jak WSGI, CGI i frameworki są połączone?

Apache nasłuchuje na porcie 80. Pobiera żądanie HTTP. Analizuje żądanie, aby znaleźć sposób odpowiedzi. Apache ma wiele możliwości reagowania. Jednym ze sposobów odpowiedzi jest użycie CGI do uruchomienia skryptu. Innym sposobem odpowiedzi jest po prostu podanie pliku.

W przypadku CGI, Apache przygotowuje środowisko i wywołuje skrypt poprzez protokół CGI. Jest to standardowa sytuacja Unix Fork / Exec -- the Podproces CGI dziedziczy środowisko systemu operacyjnego, w tym gniazdo i stdout. Podproces CGI pisze odpowiedź, która wraca do Apache; Apache wysyła tę odpowiedź do przeglądarki.

CGI jest prymitywne i denerwujące. Głównie dlatego, że rozwidla podproces dla każdego żądania, a podproces musi zakończyć lub zamknąć stdout i stderr, aby oznaczać koniec odpowiedzi.

WSGI jest interfejsem, który jest oparty na wzorcu projektowym CGI. Niekoniecznie jest to CGI - nie musi rozwidlać a podproces dla każdego żądania. Może to być CGI, ale nie musi.

WSGI dodaje do wzorca projektowego CGI na kilka ważnych sposobów. Przetwarza nagłówki żądań HTTP dla Ciebie i dodaje je do środowiska. Dostarcza dowolne Post-zorientowane wejście jako obiekt podobny do pliku w środowisku. Zapewnia również funkcję, która będzie formułować odpowiedź, oszczędzając Ci wiele szczegółów formatowania.

Co muszę wiedzieć / zainstalować / zrobić, jeśli chcę uruchomić web framework (powiedzmy web.py lub cherrypy) na mojej podstawowej konfiguracji CGI?

Przypomnijmy, że rozwidlanie podprocesu jest drogie. Można to obejść na dwa sposoby.

  1. Embedded mod_wsgi lub mod_python osadza Pythona wewnątrz Apache ' a; żaden proces nie jest rozwidlony. Apache uruchamia aplikację Django bezpośrednio.

  2. Daemon mod_wsgi or mod_fastcgi pozwala Apache ' owi na interakcję z oddzielnym demonem (lub "długotrwałym procesem"), używając protokołu WSGI. Zaczynasz Twój długo działający proces Django, następnie skonfigurujesz mod_fastcgi Apache ' a, aby komunikował się z tym procesem.

Zauważ, że {[1] } może pracować w trybie embedded lub daemon.

Kiedy przeczytasz o mod_fastcgi, zobaczysz, że Django używaflup do stworzenia interfejsu zgodnego z WSGI z informacji dostarczonych przez mod_fastcgi. Rurociąg działa w ten sposób.

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

Django ma kilka " django.rdzeń.handlowcy" dla różnych interfejsy.

Dla mod_fastcgi, Django dostarcza manage.py runfcgi, który integruje FLUP i handler.

Dla mod_wsgi, jest do tego core handler.

Jak zainstalować obsługę WSGI?

Postępuj zgodnie z tymi instrukcjami.

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

Dla tła zobacz to

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

 227
Author: S.Lott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-10 14:43:15

Myślę, że odpowiedź Floriana odpowiada na część twojego pytania o "czym jest WSGI", zwłaszcza jeśli czytaszThe PEP .

Co do pytań, które stawiasz pod koniec:

WSGI, CGI, FastCGI itp. są wszystkie protokoły dla serwera www do uruchomić kod , i dostarczyć dynamiczną zawartość, która jest wytwarzana. Porównaj to ze statycznym serwowaniem www, gdzie zwykły plik HTML jest zasadniczo dostarczany tak, jak jest do klienta.

CGI, FastCGI i SCGI są językami agnostyk. możesz pisać skrypty CGI w Perlu, Pythonie, C, bashu, cokolwiek. CGI definiuje który zostanie wywołany na podstawie adresu URL, oraz Jak zostanie wywołany: argumenty i środowisko. Określa również, w jaki sposób zwracana wartość powinna zostać przekazana z powrotem do serwera www po zakończeniu wykonywalnego. Wariacje są zasadniczo optymalizacjami, aby móc obsłużyć więcej żądań, zmniejszyć opóźnienia i tak dalej; podstawowa koncepcja jest taka sama.

WSGI jest Tylko Python. zamiast protokołu agnostycznego języka, zdefiniowana jest standardowa sygnatura funkcji:

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

Jest to kompletna (jeśli ograniczona) aplikacja WSGI. Serwer WWW z obsługą WSGI (taki jak Apache z mod_wsgi) może wywołać tę funkcję za każdym razem, gdy pojawi się żądanie.

Powodem, dla którego jest to tak wspaniałe, jest to, że możemy uniknąć niechlujnego kroku konwersji z HTTP GET / POST na CGI do Pythona i z powrotem po wyjściu. Jest o wiele bardziej bezpośredni, czysty i wydajny linkage.

Znacznie ułatwia to również posiadanie długo działających frameworków działających za serwerami sieciowymi, jeśli wszystko, co musi być zrobione dla żądania, to wywołanie funkcji. Z prostym CGI, musisz uruchomić cały framework dla każdego indywidualnego żądania.

Aby mieć obsługę WSGI, musisz mieć zainstalowany moduł WSGI (jak mod_wsgi), lub użyć serwera www z WSGI (jak CherryPy). Jeśli żadna z nich nie jest możliwa, Może użyć mostu CGI-WSGI podanego w PEP.

 54
Author: James Brady,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:38

Możesz Uruchomić WSGI przez CGI, jak pokazuje Pep333 jako przykład. Jednak za każdym razem, gdy pojawia się żądanie, uruchamiany JEST NOWY interpreter Pythona i cały kontekst (połączenia z bazami danych, itp.) musi zostać zbudowany, co wymaga czasu.

Najlepiej, jeśli chcesz uruchomić WSGI, jeśli twój host zainstaluje mod_wsgi i zrobi odpowiednią konfigurację, aby przenieść kontrolę do Twojej aplikacji.

Flup {[2] } to kolejny sposób na bieganie z WSGI dla każdego webserver, który potrafi mówić FCGI, SCGI lub AJP. Z mojego doświadczenia tylko FCGI naprawdę działa i może być używany w Apache albo przez mod_fastcgi lub jeśli możesz uruchomić oddzielny Demon Pythona z mod_proxy_fcgi.

WSGI jest protokołem podobnym do CGI, który definiuje zestaw reguł, w jaki sposób serwer WWW i Kod Pythona mogą współdziałać, jest zdefiniowany jako Pep333 . To sprawia, że wiele różnych webserverów może korzystać z wielu różnych frameworków i aplikacji korzystających z tego samego protokołu aplikacji. Jest to bardzo korzystne i sprawia, że jest tak przydatne.

 21
Author: Florian Bösch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-11 18:19:42

Jeśli jesteś niejasny we wszystkich terminach w tej przestrzeni i spójrzmy prawdzie w oczy, jest to mylący akronim obciążony jednym, istnieje również dobry czytnik w tle w postaci oficjalnego PYTHONOWEGO HOWTO, który omawia CGI vs. FastCGI vs. WSGI i tak dalej: http://docs.python.org/howto/webservers.html

 6
Author: Richard Boardman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-29 20:04:51

Jest to prosta warstwa abstrakcji dla Pythona, podobna do specyfikacji serwletów dla Javy. Podczas gdy CGI jest naprawdę niski poziom i po prostu wrzuca rzeczy do środowiska procesowego i standardowego wejścia / wyjścia, powyższe dwie specyfikacje modelują żądanie http i odpowiedź jako konstrukcje w języku. Mam jednak wrażenie, że w Pythonie ludzie nie do końca osiedlili się na de facto implementacjach, więc masz mieszankę implementacji referencyjnych i innych bibliotek typu użytkowego, które zapewniają inne rzeczy z obsługą WSGI (np. Wklej). Oczywiście, że mogę się mylić, jestem nowicjuszem w Pythonie. Społeczność "skryptów internetowych" przychodzi do problemu z innego kierunku (współdzielony hosting, dziedzictwo CGI, problemy z oddzieleniem przywilejów) niż ludzie Javy mieli Luksus rozpoczynania od (uruchamianie pojedynczego kontenera korporacyjnego w dedykowanym środowisku przeciwko statycznie skompilowanemu i wdrożonemu kodowi).

 4
Author: aaron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-05 21:48:33