Питон - статьи


Практика


Итак, погружаемся в WSGI. Пишем простенькое WSGI-приложение:

def app(environ, start_response): start_response('200 OK', [('Content-type', 'text/plain')]) return ['Hello here']

Все достаточно просто - как и говорилось выше, приложение принимает в качестве аргументов словарь переменных окружения (environ) и исполняемый объект выполнения запроса (start_response). Далее, посылаем начало ответа серверу и возвращаем сам ответ в виде итератора (в данном случае - в виде обычного списка).

Теперь встает вопрос о запуске нашего приложения. Для этого воспользуемся библиотекой wsgiref. Счастливчики с Python 2.5 в этом месте широко улыбаются, потому что у них wsgiref уже есть. Запускаем так:

from wsgiref import simple_server server = simple_server.WSGIServer( ('', 8080), simple_server.WSGIRequestHandler, ) server.set_app(app) server.serve_forever()

Тоже все достаточно просто - создаем объект сервера со стандартным обработчиком, задаем ему порт 8080 для ожидания соединений, указываем какое WSGI-приложение выполнять и запускаем сервер.

Пока что преимущества WSGI не ощущаются.

Теперь усложним задачу. Попробуем написать такой сервер, который бы работал с произвольным WSGI-приложением, и приложение, которое бы работало с произвольным WSGI-сервером. Что ж, приступим.

В начале определю, что значит "произвольный": скрипту, который реализует тот или иной компонент, передается в качестве аргумента "путь" к другому, парному, компоненту. И пусть они взаимодействуют. Чтобы не усложнять код, я написал маленький модуль, helper, который и делает всю "машинерию" по преобразованию полного имени компонента (пакет.модуль.объект) в компонент-объект. Итак, наше "тривиальное приложение" стало выглядеть так:

def app(environ, start_response): start_response('200 OK', [('Content-type', 'text/html')]) sorted_keys = environ.keys() sorted_keys.sort() result = ['<html><body><h1>TrivialWSGIApp in action</h1>'] + ['<p>Sample WSGI application.


Начало  Назад  Вперед