2012-03-12 2 views
2

У меня есть почти полное простое веб-приложение, написанное как скрипт CGI Python. Я хотел бы изменить его, чтобы использовать WSGI, но я не могу найти документацию, которая помогает мне понять, что такое WSGI (один из них неоднократно набирает вызовы с помощью start_response и т. Д., Но, похоже, не так много объяснений звонки на самом деле). Может ли кто-нибудь указать мне хорошее объяснение, а также практическое использование WSGI?Нужно руководство WSGI хорошего новичка

Edit: Должен добавить, что я видел this question, но ответы до сих пор, кажется, не сказать одно, как использовать WSGI в прямом сценарии (в отличие от в рамках).

+0

К сожалению, я только что нашел [это руководство от Armin Ronacher] (http://lucumr.pocoo.org/2007/5/21/getting-started-with-wsgi/), который, кажется, был тем, что я искал , Рекомендуется для других. Не думаю, что этот вопрос, я думаю, так просит других. – ShankarG

ответ

8

WSGI является PEP 333PEP3333 для Python 3), a.k.a. Интерфейс шлюза веб-сервера. Он состоит из трех частей, но интересующая вас часть - это то, как вы пишете приложение WSGI. И приложение WSGI является вызываемым объектом, который принимает два аргумента и возвращает итерируемый объект (или является генератором).

# this is my_app module 
def app(environ, start_response): 
    # environ is dict-like object containing the WSGI environment 
    # refer to the PEP for details 

    # start_response is a callable that, well, starts the response 
    headers = [('Content-Type', 'text/plain; charset=utf-8')] 
    start_response('200 OK', headers) 

    return ["I'm a WSGI application.\n"] 

Для запуска приложения вам нужна другая часть WSGI, которая является шлюзом. В стандартной библиотеке вы найдете wsgiref. Он содержит шлюз CGI:

#!/usr/bin/python 
# this is a CGI script that runs a WSGI application inside CGI handler 
from wsgiref.handlers import CGIHandler 
from my_app import app 
CGIHandler().run(app) 

А также простой HTTP-сервер для разработки:

from wsgiref.simple_server import make_server 
from my_app import app 
httpd = make_server('localhost', 8000, app) 
httpd.serve_forever() 

Как вы можете видеть, WSGI позволяет повторно использовать приложения в различных средах - CGI, SCGI, FastCGI , mod_wsgi, mod_python и т. д., фактически не переписывая его.

Последняя часть WSGI - это промежуточное программное обеспечение - в основном это концепция, которая позволяет комбинировать различные приложения WSGI. Он формирует своего рода сэндвич-запрос, который направляется сверху (шлюз) на дно (обычно это приложение), с промежуточными промежуточными слоями, которые могут реализовывать такие вещи, как пул соединений с базами данных или сеансы. wsgiref содержит одно такое промежуточное программное обеспечение - wsgiref.validate.validator, которое проверяет, соответствуют ли слои ниже и выше его правилам спецификации WSGI.

И это в основном это. Теперь идите в рамки.

+0

+1 за то, что я получил намного больше деталей, чем сделал. И для «Теперь идем использовать рамки». ;) – Amber

+0

Большое спасибо за прекрасный ответ - я искал путеводитель, но я думаю, что вы дали мне ответ прямо здесь! Теперь я намереваюсь сделать приложение WSGI и ** затем ** перейти к использованию фреймворка. Много потерянного времени, но я такая старая школа :) – ShankarG

+0

@ShankarG: Большинство фреймворков скрывают слой WSGI, потому что он может быть громоздким в сложных приложениях. –

0

Попробуйте прямо к источнику - PEP 333, спецификация WSGI.