Pyramid (программный каркас) | это... Что такое Pyramid (программный каркас)? (original) (raw)
Pyramid
Тип | Программный каркас веб-приложений |
Разработчик | Бен Бангерт, Джеймс Гарднер |
Операционная система | Кроссплатформенный |
Первый выпуск | декабрь 2010 г. |
Последняя версия | 1.4 (18 декабря 2012 г.) |
Лицензия | Лицензия BSD |
Сайт | pylonsproject.com |
У этого термина существуют и другие значения, см. Pyramid.
Pyramid (англ. pyramid — пирамида) — программный каркас (фреймворк) для разработки веб-приложений с открытым исходным кодом, написанный на языке Python в рамках проекта Pylons[1].
Содержание
- 1 История
- 2 Основные принципы и понятия
- 3 Возможности
- 4 Разработка приложения
- 5 Диспетчеризация URL и обход дерева ресурсов
- 6 Конфигурирование
- 7 Генерация HTML
- 8 Пример
- 9 Применение
- 10 Примечания
- 11 Ссылки
- 12 Литература
История
На создание 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()
Применение
Примечания
- ↑ О фреймворке Pyramid
- ↑ BFG переименован в Pyramid
- ↑ 1 2 Ведение в Pyramid
- ↑ Об «MVC» в Pyramid
- ↑ Перенос на Python 3
- ↑ подобно скаффолдингу
- ↑ Структура Pyramid-проекта
- ↑ Об уникальных чертах Pyramid
- ↑ Алгоритм обхода
- ↑ О конфигурировании
- ↑ Движки шаблонов
- ↑ Документация по Pyramid.
Ссылки
- 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 | Boa Constructor • Eclipse+PyDev • Eric • Geany • IDLE • Komodo • NetBeans • PyCharm • PyScripter • SPE |
Библиотеки | Beautiful Soup • NLTK • NumPy • PIL • Pygame • PyGTK • Pyparsing • PyQt • SciPy • SQLAlchemy |
Другое | ActivePython • PyPI • Python Software Foundation • Лицензия Python |
Веб-фреймворки | |
---|---|
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 | Acode • Akelos • BlueShoes • CakePHP • Canvas • CodeIgniter • Cotonti • DIY • Drupal • Fuse • Horde • Kohana • LiveStreet • PHP For Applications • PHPOpenbiz • PRADO • Qcodo • Seagull • Solar • Symfony • W3Core • Yii • Zend • Zoop • Joomla |
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) |