Как веб-фреймворки Python, WSGI и CGI подходят друг к другу

у меня есть Bluehost учетная запись, где я могу запускать скрипты Python как CGI. Я думаю, это самый простой CGI, потому что для запуска я должен определить следующее в .htaccess:

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

Теперь, когда я смотрю веб-программирование с Python, я много слышу о WSGI и о том, как большинство фреймворков используют его. Но я просто не понимаю, как все это сочетается, особенно когда мой веб-сервер предоставляется (Apache работает на машине хоста), а не то, с чем я действительно могу играть (кроме определение .htaccess команды).

как WSGI, CGI и фреймворки все подключены? Что мне нужно знать, устанавливать и делать, если я хочу запустить веб-фреймворк (скажемweb.py или CherryPy) на моей базовой конфигурации CGI? Как установить поддержку WSGI?

5 ответов


как связаны WSGI, CGI и фреймворки?

Apache прослушивает порт 80. Он получает HTTP-запрос. Он анализирует запрос, чтобы найти способ ответить. В Apache есть много вариантов для ответа. Один из способов ответа-использовать CGI для запуска сценария. Другой способ ответить - просто подать файл.

в случае CGI Apache подготавливает среду и вызывает скрипт через протокол CGI. Это стандартный Unix Ситуация Fork / Exec -- подпроцесс CGI наследует среду ОС, включая сокет и stdout. Подпроцесс CGI записывает ответ, который возвращается в Apache; Apache отправляет этот ответ в браузер.

CGI примитивен и раздражает. В основном потому, что он разветвляет подпроцесс для каждого запроса, и подпроцесс должен выйти или закрыть stdout и stderr, чтобы обозначить конец ответа.

WSGI-это интерфейс, основанный на шаблоне проектирования CGI. Это не обязательно CGI -- он не должен разветвлять подпроцесс для каждого запроса. Это может быть CGI, но это не обязательно.

WSGI добавляет в шаблон проектирования CGI несколькими важными способами. Он анализирует заголовки HTTP-запросов для вас и добавляет их в среду. Он предоставляет любой пост-ориентированный ввод в качестве файлового объекта в среде. Он также предоставляет вам функцию, которая будет формулировать ответ, экономя вас от большого количества форматирования подробности.

что мне нужно знать / устанавливать / делать, если я хочу запустить веб-фреймворк (скажем web.py или cherrypy) на моей базовой конфигурации CGI?

Напомним, что разветвление подпроцесса дорого. Есть два способа обойти это.

  1. встроенный mod_wsgi или mod_python встраивает Python внутри Apache; процесс не разветвлен. Apache запускает приложение Django непосредственно.

  2. Демон mod_wsgi или mod_fastcgi позволяет Apache взаимодействовать с отдельным демоном (или" длительным процессом"), используя протокол WSGI. Вы начинаете свой длительный процесс Django, а затем настраиваете mod_fastcgi Apache для связи с этим процессом.

отметим, что mod_wsgi может работать в любом режиме: embedded или daemon.

когда вы прочитаете mod_fastcgi, вы увидите, что Django использует flup чтобы создать WSGI-совместимый интерфейс из информации, предоставленной mod_fastcgi. Трубопровод работает так.

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

Django имеет несколько " django.ядро.обработчики" для различных интерфейсов.

для mod_fastcgi Django предоставляет manage.py runfcgi это интегрирует FLUP и обработчик.

для mod_wsgi для этого есть основной обработчик.

Как установить поддержку WSGI?

выполните следующие инструкции.

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

для фона см. Это

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


Я думаю ответ Флориана отвечает на часть вашего вопроса о "ЧТО ТАКОЕ WSGI", особенно если Вы читаете ОПТОЗОС.

Что касается вопросов, которые вы задаете в конце:

WSGI, CGI, FastCGI etc. все протоколы для веб-сервера выполнить код, и доставить динамическое содержимое, которое производится. Сравните это со статической веб-службой, где простой HTML-файл в основном поставляется как клиент.

CGI, FastCGI и SCGI являются агностиками языка. вы можете писать скрипты CGI в Perl, Python, C, bash, что угодно. CGI определяет , который исполняемый файл будет вызываться на основе URL-адреса и как он будет называться: Аргументы и среда. Он также определяет, как возвращаемое значение должно быть передано обратно на веб-сервер после завершения исполняемого файла. Вариации в основном оптимизации, чтобы иметь возможность обрабатывать больше запросов, уменьшите латентность и так далее; основная концепция такая же.

WSGI-это только Python. вместо языкового агностического протокола определяется стандартная сигнатура функции:

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

это полное (Если ограничено) приложение WSGI. Веб-сервер с поддержкой WSGI (например, Apache с mod_wsgi) может вызывать эту функцию при поступлении запроса.

причина этого настолько велика, что мы можем избежать грязного шага преобразования из HTTP GET / POST в CGI на Python и обратно на выходе. Это гораздо более прямая, чистая и эффективная связь.

это также значительно упрощает работу долгосрочных фреймворков, работающих за веб-серверами, если все, что нужно сделать для запроса, это вызов функции. С простым CGI вам придется запустите всю свою структуру для каждого отдельного запроса.

чтобы иметь поддержку WSGI, вам нужно будет установить модуль WSGI (например mod_wsgi) или использовать веб-сервер с WSGI, запеченным в (например,CherryPy). Если ни то, ни другое невозможно, ты!--10-- > мог бы используйте мост CGI-WSGI, указанный в ОПТОСОЗ.


вы можете запустите WSGI над CGI, как демонстрирует Pep333 в качестве примера. Однако каждый раз, когда появляется запрос, запускается новый интерпретатор Python и весь контекст (подключения к базе данных и т. д.) должен быть построен, который все занимает время.

лучше всего, если вы хотите запустить WSGI, если ваш хост установит mod_wsgi и сделал соответствующую конфигурацию, чтобы отложить контроль над вашим приложением.

Flup другой способ работы с WSGI для любого веб-сервера, который может говорить FCGI, SCGI или AJP. По моему опыту только FCGI действительно работает, и его можно использовать в Apache либо через модуль mod_fastcgi веб или если вы можете запустить отдельный демон на Python с mod_proxy_fcgi.

WSGI это протокол, очень похожий на CGI, который определяет набор правил, как веб-сервер и код Python могут взаимодействовать, он определяется как Pep333. Это делает его возможно, что многие различные веб-серверы могут использовать множество различных фреймворков и приложений, использующих один и тот же протокол приложения. Это очень полезно и делает его таким полезным.


Если вам неясны все термины в этом пространстве, и давайте посмотрим правде в глаза, его запутанная аббревиатура, есть также хороший фоновый ридер в виде официального python HOWTO, который обсуждает CGI против FastCGI против WSGI и так далее:http://docs.python.org/howto/webservers.html


Это простой слой абстракции для Python, сродни тому, что спецификация сервлета для Java. В то время как CGI действительно низкий уровень и просто сбрасывает материал в среду процесса и стандартный вход/выход, вышеупомянутые две спецификации моделируют http-запрос и ответ как конструкции на языке. Мое впечатление, однако, заключается в том, что в Python люди не совсем остановились на де-факто реализациях, поэтому у вас есть сочетание ссылочных реализаций и других библиотек утилитарного типа, которые предоставляют другие вещи с поддержкой WSGI (например, вставить). Конечно, я могу ошибаться, я новичок в Python. Сообщество "веб-сценариев" подходит к проблеме с другого направления (общий хостинг, наследие CGI, проблемы разделения привилегий), чем у Java-пользователей была роскошь начать с (запуск одного корпоративного контейнера в выделенной среде против статически скомпилированного и развернутого кода).