Как веб-платформы Python, WSGI и CGI совмещаются

148
задан Peter Mortensen 11 June 2011 в 18:16
поделиться

4 ответа

, Как WSGI, CGI и платформы все соединены?

Apache слушает на порте 80. Это получает Запрос HTTP. Это анализирует запрос для нахождения способа ответить. Apache имеет БОЛЬШОЙ выбор для ответа. Один способ ответить состоит в том, чтобы использовать CGI для запущения скрипта. Другой способ ответить состоит в том, чтобы просто служить файлу.

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

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

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

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

, Что я должен знать / установка / делает, если я хочу работать, веб-платформа (скажите что 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 может работать в любом режиме: встроенный или демон.

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

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

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

Для 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

238
ответ дан Cœur 23 November 2019 в 22:29
поделиться

Я думаю ответ Florian ответы часть Вашего вопроса о, "что такое WSGI", особенно, если Вы читаете PEP.

Что касается вопросов Вы позируете к концу:

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

CGI, FastCGI и SCGI являются агностиком языка. можно записать сценарии CGI в Perl, Python, C, удар, безотносительно. 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 ДОБРАЛСЯ/POST до CGI к Python, и назад снова на выходе. Это - намного более прямая, чистая и эффективная связь.

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

, Чтобы иметь поддержку WSGI, Вы должны будете установить модуль WSGI (как mod_wsgi) или используете веб-сервер с WSGI, испеченным в (как CherryPy). Если ни один из тех не возможен, Вы могли использовать мост CGI-WSGI, данный в PEP.

56
ответ дан Community 23 November 2019 в 22:29
поделиться

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

4
ответ дан aaron 23 November 2019 в 22:29
поделиться

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

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

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

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

21
ответ дан Peter Mortensen 23 November 2019 в 22:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: