Pull to refresh

WSGI, Paste, Pylons — передовые веб-технологии

Website development *
Python Logo
Не Rails'ом единым!

Цитата с sm.org.
Тема WSGI на Хабре не раскрыта, я постараюсь ликвидировать возможную безграмотность и просто интересно рассказать об актуальной, на мой взгляд, технологии. А заодно затрону Paste и галопом – Pylons. Но обо всё по порядку.

WSGI


WSGI (Web Server Gateway Interface) – интерфейс для взаимодействия веб-сервера и работающих на нём веб-приложений, написанных на Python. WSGI является стандартом Python и описан в PEP 333. Это очень молодая технология. Детище Phillip J. Eby, изначально называвшееся Python Web Container
Interface, было отправлено в качестве претендента на PEP в Python Web-SIG 7 декабря 2003 года. А в августе 2004 получило своё современное название и отправилось в большое плавание. Несколько слов об этой технологии.
Современное многообразие языков программирования и фреймворков для веба наверняка приводит в ужас начинающих программистов. А более опытных поражает тем, что даже приложения, написанные на одном языке, являются сильно несовместимыми и неспособствующими повторному использованию кода. Перенос проекта из-под одного сервера под другой нередко становится сильной головной болью. Поэтому появление объединяющих стандартов является закономерым шагом развития технологий.
WSGI – это интерфейс (а говоря другими словами – прослойка) между веб-сервером и веб-приложением. Поэтому со стороны приложения это выглядит как веб-сервер, а со стороны сервера – как приложение. Это важная концепция. Она говорит о том, что для вашего проекта, написанного под WSGI, абсолютно всё равно, запущен ли он, скажем, на mod_python под Apache или как FastCGI где-то ещё. И вы можете заниматься написанием приложения, а не изучением API или окружения в выбранной связке.

Hello world!


Выглядит на практике это очень вкусно (пример WSGI-совместимого приложения):
<b>def</b> app(environ, start_response):
  start_response(<span style="color:#693">'200 OK'</span>, [(<span style="color:#693">'Content-Type'</span>, <span style="color:#693">'text/plain'</span>)])
  return [<span style="color:#693">'Hello World!\n'</span>]

Пример лаконичен и показателен.
  • WSGI-приложение – callable-объект (например функция), который можно вызвать с двумя агрументами: словарь, иммитирующий переменные окружения, и callable-объект для начинания ответа, то есть отправки HTTP-статуса (200 OK) и HTTP-заголовков.
  • environ очень напоминает CGI-окружение и содержит знакомые значения (REQUEST_METHOD, PATH_INFO) наряду со специфичными для WSGI (environ['wsgi.input'] содержит поток для чтения данных, переданных POST-методом).
  • Приложение возврашает итератор с телом ответа, проще говоря – массив строк, которые будут склеены и отправлены в браузер.


В игру вступает Paste


Хотите проверить, как работает ваше приложение, прямо сейчас, добавив 3 строчки кода?

<b>if</b> __name__ == <span style="color:#693">'__main__'</span>:
  <b>from</b> paste <b>import</b> httpserver
  httpserver.serve(app, host=<span style="color:#693">'127.0.0.1'</span>, port=<span style="color:#693">'8080'</span>)

Paste – метафреймворк, набор компонент и утилит как для веб-программиста, так и для администратора.
Администратору:
  • поможет быстро и легко устанавливать, запускать и настраивать написанные под Paste веб-приложения; интегрировать их с веб-сервером при помощи WSGI (а также SCGI, FCGI, AJP);
  • позволит легко поддерживать, управлять и устанавливать приложения в системе (system-wide).

Программисту, в свою очередь, Paste
  • предоставляет command-line-утилиты и начальные шаблоны для значительного упрощения работы с вашим фреймворком;
  • облегчает весь цикл разработки: начинание проекта, обновление, тестирование и развёртывание,
  • делает разработку WSGI-приложений приятным и интересным делом,
  • да ещё много чего.

В данном случае мы использовали встроенный в Paste HTTP-сервер, чтобы моментально показать, как всё это работает. Этот сервер также используется в процессе разработки реальных приложений с помощью фреймворков. Впрочем, это совершенно стандартная и необходимая вещь, также используемая в Ruby on Rails.
Также Paste содержит массу полезных вещей. Их наличие и обилие как раз и позволяет говорить о Paste и как о фреймворке, и как о метафреймворке. Приставка мета- говорит о том, что это фреймворк для создания фреймворков, и происходит от греческого μετά (после, за, между).

Концепция: стек приложений


Вернёмся к WSGI. Представьте себе, что будет, если внутри WSGI-приложения сделать предварительную обработку запроса (скажем, по идентификатору сессии в куках восстановить пользователя из базы данных), вызвать другое WSGI-приложение и вернуть результат работы последнего? Получится почти что схема для поддержки аутентификации. А если первое приложение вызывает второе, а к результатам его деятельности применяет XSL transformations?
Тут проявляется ещё одна важная концепция. Первое приложение в этих примерах выступает в роли прослойки, или middleware. А совокупность всех middleware образует стек приложения. Таким образом получается очень модульная система, в которой компоненты можно даже не подключать, а просто класть в нужном порядке на WSGI-основу (не забыв сверху свою аппликацию).

С помощью такой системы можно подключить SQLAlchemy – «the Python SQL toolkit and Object Relational Mapper that gives application developers the full power and flexibility of SQL», AuthKit – универсальный и гибкий фреймворк для авторизации пользователей, и не только, проверьте. И конечно же – middleware для ловли исключений и преобразования их в страницы «упс» и «ой-ой-ой». Надо сказать, что Paste поощряет обёртываение в middleware даже таких невебовских частей, как конфигурирование. Получается простая, очевидная и безусловно гибкая структура приложения.

Всё вместе и кое-что ещё — Pylons


Итак, WSGI обеспечивает связь веб-сервера с многослойной middleware-структурой. Paste поможет решить типичные задачи – тестирование, отлов исключений, внутренние редиректы запросов и даже индикатор загрузки файла (Upload Progress Monitor). Авторизация, аутентификация и работа с базой данных без единой строчки SQL были приведены как пример middleware чуть выше.
Теперь добавим сюда маршрутизацию запросов с помощью Routes, серверную часть AJAX – WebHelpers (оба компонента полностью портированы с RoR), шаблоны Mako – элегантные, с уникальными возможностями и невероятной скоростью, поддержку Unicode и I18N, соберём всё это вместе в полноценную Model-View-Controller-структуру и получим Pylons – передовой WSGI-совместимый веб-фреймворк для Python, вобравший всё лучшее из Python, RoR и других фреймворков и проектов.
Справедливости и критики ради стоит отметить, что указанные технологии очень молоды, например, Pylons ещё в версии 0.9.5, а AuthKit в разработке и пока не рекомендован для использования в продакшене. Тем не менее, я надеюсь, что мне получилось убедить вас в том, что WSGI перспективен, а наполненный библиотеками Paste и другими представляет собой почти идеальный (или канонический?) веб-фреймворк. Хотя применять технологию WSGI можно и в TurboGears, CherryPy, Django и других фреймворках.
Конечно для хоть сколько-нибудь объективного их сравнения мне не хватит опыта, но написание одного и того же приложения под Pylons и Django позволяет мне сделать вывод о том, что Pylons реально рулит, хотя и более сложен в освоении и установке.

Кое-что из использованного


Tags:
Hubs:
Total votes 34: ↑28 and ↓6 +22
Views 8K
Comments 44
Comments Comments 44