- Pyramid (программный каркас)
-
Pyramid Тип Разработчик Бен Бангерт, Джеймс Гарднер
Операционная система Первый выпуск Последняя версия 1.4 (18 декабря 2012 г.)
Лицензия Сайт Pyramid (англ. pyramid — пирамида) — программный каркас (фреймворк) для разработки веб-приложений с открытым исходным кодом, написанный на языке Python в рамках проекта Pylons[1].
Содержание
История
На создание Pyramid оказали влияние такие фреймворки, как Zope, Pylons и Django. Код Pyramid разрабатывался в проекте repoze.bfg, а название поменялось в результате слияния проектов BFG и Pylons.[2]
Основные принципы и понятия
Дизайн Pyramid основан на следующих принципах[3]:
- простота,
- минимализм,
- документированность,
- скорость,
- надёжность,
- открытость.
В защиту своего дизайна авторы Pyramid написали довольно большой документ, который призван развеять мифы о фреймворке. Например, на критику модели MVC в Pyramid следует подробное объяснение, что MVC «притянут за уши» к веб-приложениям. Следующая цитата[4] хорошо характеризует подход к терминологии в Pyramid:
Возможности
Основными «изюминками» Pyramid являются[3]:
- возможность написать приложение в одном файле;
- конфигурация, основанная на декораторах;
- формирование URL на ресурсы;
- обслуживание запросов на статические файлы;
- панель инструментов для отладки приложения прямо в браузере;
- гибкая настройка отладки;
- дополнительные модули;
- виды (view) на основе как классов, так и функций;
- конфигурирование файлов-ресурсов (assets), то есть, файлов проекта, не являющихся файлами с исходным кодом на Python;
- расширяемые, взаимозаменяемые шаблоны (template);
- система событий;
- встроенная интернационализация (i18n);
- кэширование HTTP;
- встроенная поддержка сессий;
- виды для исключений;
- нет необходимости в одиночках (singleton);
- предикаты видов и множественные виды для маршрута (route);
- управление транзакциями, в том числе при работе сразу с несколькими базами данных;
- расширяемость конфигурации через механизм включения (include);
- гибкая, расширяемая аутентификация и авторизация;
- возможность обхода (traversal) дерева ресурсов;
- автоматизация повторяющейся конфигурации;
- 100 % покрытие кода тестами;
- поддержка пользователей (особенно начинающих) силами сообщества;
- высокая документированность;
- почти все компоненты перенесены и работают в Python3.2[5].
Разработка приложения
Хотя не составляет большой трудности написать Pyramid-приложение (проект) с нуля, Pyramid имеет инструменты для инициализации кода нового приложения по выбранному шаблону, или, в терминологии Pyramid, каркасной структуре (англ. scaffolds[6]). Например, в поставке имеются каркасные структуры для проектов, использующих ZODB или SQLAlchemy.
Проект — это каталог, содержащий по крайней мере один пакет на Python.
Типичная структура каталога для небольшого проекта:
MyProject/ |-- CHANGES.txt |-- development.ini |-- MANIFEST.in |-- myproject | |-- __init__.py | |-- static | | |-- favicon.ico | | |-- logo.png | | `-- pylons.css | |-- templates | | `-- mytemplate.pt | |-- tests.py | `-- views.py |-- production.ini |-- README.txt |-- setup.cfg `-- setup.py
Приведённую структуру, как следует из документации, не следует сильно изменять, так как это может помешать другим разработчикам быстро ориентироваться в коде проекта[7]. Тем не менее, растущий проект может потребовать некоторых изменений. Например, виды, модели (если они используются) и тесты можно, разбив на модули, перенести соответственно в подкаталоги views, models и tests (не забыв снадбить их файлом
__init__.py
).Проект может, например, находиться в составе buildout (скажем, в каталоге src), который собирает все необходимые компоненты вместе. Совсем необязательно, чтобы Pyramid-проект состоял из одного пакета. Величина проекта ограничивается только достаточностью знаний разработчиков о возможностях Pyramid[8].
Следует отметить, что Pyramid может работать с любым WSGI-сервером. Проекты, созданные по готовым каркасным структурам, используют сервер Waitress.
Диспетчеризация URL и обход дерева ресурсов
Каждый поступающий на сервер приложений Pyramid запрос (request) должен найти вид (view), который и будет его обрабатывать.
В Pyramid имеется два базовых подхода к поиску нужного вида для обрабатываемого запроса: на основе сопоставления (matching), как в большинстве подобных фреймворков, и обхода (traversal), как в Zope. Кроме того, в одном приложении можно с успехом сочетать оба подхода.
Простейший пример с заданием маршрута (заимствован из документации):
# Здесь config - экземпляр pyramid.config.Configurator config.add_route('idea', 'site/{id}') config.add_view('mypackage.views.site_view', route_name='idea')
Использование обхода лучше проиллюстрировать на небольшом примере:
from wsgiref.simple_server import make_server from pyramid.config import Configurator from pyramid.response import Response # Класс некоторого ресурса class Resource(dict): pass # Дерево ресурсов (жёстко закодированное) в фабрике корня def get_root(request): return Resource({'a': Resource({'b': Resource({'c': Resource()})})}) # Вид-для-вызова, который умеет показывать ресурс Resource (в context) def hello_world_of_resources(context, request): output = "Ресурс и его дети: %s" % context return Response(output) if __name__ == '__main__': config = Configurator(root_factory=get_root) config.add_view(hello_world_of_resources, context=Resource) app = config.make_wsgi_app() server = make_server('0.0.0.0', 8080, app) server.serve_forever()
В этом примере иерархия для обхода жестко задана в методе
get_root
с помощью вложенных словарей, тогда как реальные приложения должны сами определять необходимый доступ по ключам (метод__getitem__
помогает организовать такой доступ). В коде также присутствует корневая фабрика, с которой собственно и начинается обход узлов (node) дерева ресурсов. Вид-для-вызова (view callable) представлен функциейhello_world_of_resources
. Говоря несколько упрощённо, на основе URL запроса в результате обхода иерархии Pyramid находит ресурс и применяет к нему «наилучший» вид-для-вызова (в нашем примере — он единственный).[9]Конфигурирование
Конфигурирование приложения, то есть, задание настроек, влияющих на его работу, может осуществляться в Pyramid двумя способами: императивным и декларативным.
Императивное конфигурирование производится вызовами методов конфигуратора непосредственно перед стартом приложения.
Декларативное конфигурирование задается декораторами видов. Перед запуском приложение «сканируется» на предмет конфигурационных параметров методом
scan()
конфигуратора. Пример из документации:from pyramid.response import Response from pyramid.view import view_config @view_config(name='hello', request_method='GET') def hello(request): return Response('Hello')
Оба метода конфигурирования полностью взаимозаменяемы.[10]
Желающие могут использовать для конфигурирования ZCML, установив соответствующий пакет.
Генерация HTML
В Pyramid можно использовать различные движки для генерации HTML. Так, Chameleon и Mako входят в поставку.[11] Кроме них, можно подключить и другие, например, Jinja2.
Работа с формами может осуществляться, например, с помощью троицы Peppercorn-Colander-Deform.
Пример
Одно из наиболее простых приложений для Pyramid[12]:
from wsgiref.simple_server import make_server from pyramid.config import Configurator from pyramid.response import Response def hello_world(request): return Response('Hello %(name)s!' % request.matchdict) if __name__ == '__main__': config = Configurator() config.add_route('hello', '/hello/{name}') config.add_view(hello_world, route_name='hello') app = config.make_wsgi_app() server = make_server('0.0.0.0', 8080, app) server.serve_forever()
Применение
Примечания
Ссылки
- Chris McDonough, The Pyramid Web Application Development Framework (PDF) (англ.)
- Pyramid Cookbook (англ.)
- Pyramid Single File Tasks Tutorial (англ.) Небольшое учебное руководство по Pyramid
Литература
- Chris McDonough The Pyramid Web Application Development Framework: Version 1.0. — Agendaless Consulting, 2011. — 596 с. — ISBN 978-0615445670
Для улучшения этой статьи желательно?: - Найти и оформить в виде сносок ссылки на авторитетные источники, подтверждающие написанное.
- Проставив сноски, внести более точные указания на источники.
Python Люди Реализации ChinesePython • CLPython • CPython • JPype • Jython • IronPython • PyPy • Python for S60 • Psyco • Stackless Python • Unladen Swallow
Фреймворки CherryPy • Django • Flask • GAE framework • Pylons • Pyramid • Quixote • TurboGears • Twisted • Web2py • Zope
IDE Библиотеки Другое Веб-фреймворки ASP.NET DotNetNuke • ASP.NET MVC • MonoRail
ColdFusion ColdSpring • Fusebox • Mach-II • Model-Glue
Java Apache (Cocoon • Struts • Velocity • WebWork 2) • AppFuse • Aranea • Eclipse • Facelets • Flexive • FreeMarker • Google Web Toolkit • Grails • Hamlets • ItsNat • JavaServer Faces • Jspx • JBoss Seam • jZeno • Makumba • OpenLaszlo • OpenXava • Reasonable Server Faces (RSF) • Restlet • RichFaces • RIFE • Shale • SmartClient • Spring • Stripes • Tapestry • ThinWire • Vaadin • WebMacro • WebWork • WebObjects • Wicket • ZK
JavaScript node.js • AJILE • Clean AJAX • Dojo Toolkit • Echo • Ext JS • jQuery • jMaki • Microsoft AJAX Library • MochiKit • MooTools • Prototype • qooxdoo • Rialto Toolkit • Rico • script.aculo.us • SmartClient • Spry • SproutCore • Yahoo! UI Library • Underscore • PhoneGap
Perl Catalyst • Interchange • Titanium • Maypole • HTML:Mason
PHP Python CherryPy • Django • GAE framework • Karrigell • Nevow • Porcupine • Pylons • Pyramid • Spyce • TurboGears • Twisted • Tornado • Webware • Zope
Ruby Camping • Nitro • IOWA • Ramaze • Cerise • Merb • Ruby on Rails • Sinatra • Padrino
Прочие
языкиAlpha Five • Fusebox (ColdFusion • PHP) • Helma Object Publisher (Server-side) • Lift (Scala) • Magic (Scheme) • OpenACS (Tcl) • Seaside (Smalltalk) • UnCommon Web (Common Lisp) • Yaws (Erlang) • Oracle Application Express (PL/SQL)
Категории:- Программное обеспечение по алфавиту
- Серверы приложений
- Свободное программное обеспечение, написанное на Python
- Каркасы веб-приложений на Python
- Каркасы веб-приложений
- Свободные библиотеки программ
- Библиотеки Python
- Программное обеспечение с лицензией BSD
- Кроссплатформенное программное обеспечение
Wikimedia Foundation. 2010.