Я думаю, что ответ Флориана отвечает на ваш вопрос о том, что такое WSGI, особенно если вы читаете PEP .
Что касается вопросов, которые вы ставите ближе к концу:
WSGI, CGI, FastCGI и т. Д. - все это протоколы для веб-сервера для запуска кода и доставки динамического контента, который создается. Сравните это со статической веб-службой, где обычный 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 ). Если ни то, ни другое невозможно, вы можете использовать мост CGI-WSGI, указанный в PEP.