Pyramid (программный каркас)

Поделись знанием:
Перейти к: навигация, поиск
Pyramid
Тип

Программный каркас веб-приложений

Разработчик

Бен Бангерт, Джеймс Гарднер

Операционная система

Кроссплатформенный

Первый выпуск

декабрь 2010 г.

Последняя версия

1.6.1 (3 января 2016 г.)

Лицензия

Лицензия BSD

Сайт

[www.pylonsproject.com/ onsproject.com]

К:Википедия:Статьи без изображений (тип: не указан)К:Программное обеспечение, разработанное в 2010 году

Pyramid (англ. pyramid — пирамида) — программный каркас (фреймворк) для разработки веб-приложений с открытым исходным кодом, написанный на языке Python в рамках проекта Pylons[1].





История

На создание Pyramid оказали влияние такие фреймворки, как Zope, Pylons и Django. Код Pyramid разрабатывался в проекте repoze.bfg, а название поменялось в результате слияния проектов BFG и Pylons.[2]

Основные принципы и понятия

Дизайн Pyramid основан на следующих принципах[3]:

  • простота,
  • минимализм,
  • документированность,
  • скорость,
  • надёжность,
  • открытость.

В защиту своего дизайна авторы Pyramid написали довольно большой документ, который призван развеять мифы о фреймворке. Например, на критику модели MVC в Pyramid следует подробное объяснение, что MVC «притянут за уши» к веб-приложениям. Следующая цитата[4] хорошо характеризует подход к терминологии в Pyramid:

Мы считаем, что есть только две вещи: ресурсы (resource) и виды (view). Дерево ресурсов представляет структуру сайта, а вид представляет ресурс. Шаблоны (template) в реальности лишь деталь реализации некоторого вида: строго говоря, они не обязательны, и вид может вернуть ответ (response) и без них. Нет никакого "контроллера" (controller): его просто не существует. "Модель" (model) же либо представлена деревом ресурсов, либо "доменной моделью" (domain model) (например, моделью SQLAlchemy), которая вообще не является частью каркаса. Нам кажется, что наша терминология более разумна при существующих ограничениях веб-технологий.

Возможности

Основными «изюминками» 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()

Применение

  • [karlproject.org/architecture.html Проект KARL]

Напишите отзыв о статье "Pyramid (программный каркас)"

Примечания

  1. [pylonsproject.org/projects/pyramid/about О фреймворке Pyramid]
  2. [www.plope.com/bfg-becomes-pyramid BFG переименован в Pyramid]
  3. 1 2 [docs.pylonsproject.org/projects/pyramid/en/1.3-branch/narr/introduction.html Ведение в Pyramid]
  4. [docs.pylonsproject.org/projects/pyramid/en/1.3-branch/designdefense.html#pyramid-gets-its-terminology-wrong-mvc Об «MVC» в Pyramid]
  5. [github.com/Pylons/pyramid/wiki/Python-3-Porting Перенос на Python 3]
  6. подобно скаффолдингу
  7. [docs.pylonsproject.org/projects/pyramid/en/1.3-branch/narr/project.html#the-project-structure Структура Pyramid-проекта]
  8. [pyramid.readthedocs.org/en/1.3-branch/narr/introduction.html#what-makes-pyramid-unique Об уникальных чертах Pyramid]
  9. [pyramid.readthedocs.org/en/1.3-branch/narr/traversal.html#a-description-of-the-traversal-algorithm Алгоритм обхода]
  10. [docs.pylonsproject.org/projects/pyramid/en/1.3-branch/narr/configuration.html О конфигурировании]
  11. [docs.pylonsproject.org/projects/pyramid/en/1.0-branch/narr/templates.html Движки шаблонов]
  12. [docs.pylonsproject.org/en/latest/docs/pyramid.html Документация по Pyramid.]

Ссылки

  • Chris McDonough, [static.pylonsproject.org/pyramid-1.1.pdf The Pyramid Web Application Development Framework] (PDF(англ.)
  • [docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/ Pyramid Cookbook] (англ.)
  • [docs.pylonsproject.org/projects/pyramid_tutorials/en/latest/single_file_tasks/single_file_tasks.html Pyramid Single File Tasks Tutorial] (англ.) Небольшое учебное руководство по Pyramid

Литература

  • Chris McDonough. The Pyramid Web Application Development Framework: Version 1.0. — Agendaless Consulting, 2011. — 596 с. — ISBN 978-0615445670.


Отрывок, характеризующий Pyramid (программный каркас)

– Allez voir, mon cher, si la troisieme division a depasse le village. Dites lui de s'arreter et d'attendre mes ordres. [Ступайте, мой милый, посмотрите, прошла ли через деревню третья дивизия. Велите ей остановиться и ждать моего приказа.]
Только что князь Андрей отъехал, он остановил его.
– Et demandez lui, si les tirailleurs sont postes, – прибавил он. – Ce qu'ils font, ce qu'ils font! [И спросите, размещены ли стрелки. – Что они делают, что они делают!] – проговорил он про себя, все не отвечая австрийцу.
Князь Андрей поскакал исполнять поручение.
Обогнав всё шедшие впереди батальоны, он остановил 3 ю дивизию и убедился, что, действительно, впереди наших колонн не было стрелковой цепи. Полковой командир бывшего впереди полка был очень удивлен переданным ему от главнокомандующего приказанием рассыпать стрелков. Полковой командир стоял тут в полной уверенности, что впереди его есть еще войска, и что неприятель не может быть ближе 10 ти верст. Действительно, впереди ничего не было видно, кроме пустынной местности, склоняющейся вперед и застланной густым туманом. Приказав от имени главнокомандующего исполнить упущенное, князь Андрей поскакал назад. Кутузов стоял всё на том же месте и, старчески опустившись на седле своим тучным телом, тяжело зевал, закрывши глаза. Войска уже не двигались, а стояли ружья к ноге.
– Хорошо, хорошо, – сказал он князю Андрею и обратился к генералу, который с часами в руках говорил, что пора бы двигаться, так как все колонны с левого фланга уже спустились.
– Еще успеем, ваше превосходительство, – сквозь зевоту проговорил Кутузов. – Успеем! – повторил он.
В это время позади Кутузова послышались вдали звуки здоровающихся полков, и голоса эти стали быстро приближаться по всему протяжению растянувшейся линии наступавших русских колонн. Видно было, что тот, с кем здоровались, ехал скоро. Когда закричали солдаты того полка, перед которым стоял Кутузов, он отъехал несколько в сторону и сморщившись оглянулся. По дороге из Працена скакал как бы эскадрон разноцветных всадников. Два из них крупным галопом скакали рядом впереди остальных. Один был в черном мундире с белым султаном на рыжей энглизированной лошади, другой в белом мундире на вороной лошади. Это были два императора со свитой. Кутузов, с аффектацией служаки, находящегося во фронте, скомандовал «смирно» стоявшим войскам и, салютуя, подъехал к императору. Вся его фигура и манера вдруг изменились. Он принял вид подначальственного, нерассуждающего человека. Он с аффектацией почтительности, которая, очевидно, неприятно поразила императора Александра, подъехал и салютовал ему.
Неприятное впечатление, только как остатки тумана на ясном небе, пробежало по молодому и счастливому лицу императора и исчезло. Он был, после нездоровья, несколько худее в этот день, чем на ольмюцком поле, где его в первый раз за границей видел Болконский; но то же обворожительное соединение величавости и кротости было в его прекрасных, серых глазах, и на тонких губах та же возможность разнообразных выражений и преобладающее выражение благодушной, невинной молодости.
На ольмюцком смотру он был величавее, здесь он был веселее и энергичнее. Он несколько разрумянился, прогалопировав эти три версты, и, остановив лошадь, отдохновенно вздохнул и оглянулся на такие же молодые, такие же оживленные, как и его, лица своей свиты. Чарторижский и Новосильцев, и князь Болконский, и Строганов, и другие, все богато одетые, веселые, молодые люди, на прекрасных, выхоленных, свежих, только что слегка вспотевших лошадях, переговариваясь и улыбаясь, остановились позади государя. Император Франц, румяный длиннолицый молодой человек, чрезвычайно прямо сидел на красивом вороном жеребце и озабоченно и неторопливо оглядывался вокруг себя. Он подозвал одного из своих белых адъютантов и спросил что то. «Верно, в котором часу они выехали», подумал князь Андрей, наблюдая своего старого знакомого, с улыбкой, которую он не мог удержать, вспоминая свою аудиенцию. В свите императоров были отобранные молодцы ординарцы, русские и австрийские, гвардейских и армейских полков. Между ними велись берейторами в расшитых попонах красивые запасные царские лошади.
Как будто через растворенное окно вдруг пахнуло свежим полевым воздухом в душную комнату, так пахнуло на невеселый Кутузовский штаб молодостью, энергией и уверенностью в успехе от этой прискакавшей блестящей молодежи.
– Что ж вы не начинаете, Михаил Ларионович? – поспешно обратился император Александр к Кутузову, в то же время учтиво взглянув на императора Франца.
– Я поджидаю, ваше величество, – отвечал Кутузов, почтительно наклоняясь вперед.
Император пригнул ухо, слегка нахмурясь и показывая, что он не расслышал.
– Поджидаю, ваше величество, – повторил Кутузов (князь Андрей заметил, что у Кутузова неестественно дрогнула верхняя губа, в то время как он говорил это поджидаю ). – Не все колонны еще собрались, ваше величество.
Государь расслышал, но ответ этот, видимо, не понравился ему; он пожал сутуловатыми плечами, взглянул на Новосильцева, стоявшего подле, как будто взглядом этим жалуясь на Кутузова.
– Ведь мы не на Царицыном лугу, Михаил Ларионович, где не начинают парада, пока не придут все полки, – сказал государь, снова взглянув в глаза императору Францу, как бы приглашая его, если не принять участие, то прислушаться к тому, что он говорит; но император Франц, продолжая оглядываться, не слушал.
– Потому и не начинаю, государь, – сказал звучным голосом Кутузов, как бы предупреждая возможность не быть расслышанным, и в лице его еще раз что то дрогнуло. – Потому и не начинаю, государь, что мы не на параде и не на Царицыном лугу, – выговорил он ясно и отчетливо.
В свите государя на всех лицах, мгновенно переглянувшихся друг с другом, выразился ропот и упрек. «Как он ни стар, он не должен бы, никак не должен бы говорить этак», выразили эти лица.
Государь пристально и внимательно посмотрел в глаза Кутузову, ожидая, не скажет ли он еще чего. Но Кутузов, с своей стороны, почтительно нагнув голову, тоже, казалось, ожидал. Молчание продолжалось около минуты.
– Впрочем, если прикажете, ваше величество, – сказал Кутузов, поднимая голову и снова изменяя тон на прежний тон тупого, нерассуждающего, но повинующегося генерала.
Он тронул лошадь и, подозвав к себе начальника колонны Милорадовича, передал ему приказание к наступлению.
Войско опять зашевелилось, и два батальона Новгородского полка и батальон Апшеронского полка тронулись вперед мимо государя.
В то время как проходил этот Апшеронский батальон, румяный Милорадович, без шинели, в мундире и орденах и со шляпой с огромным султаном, надетой набекрень и с поля, марш марш выскакал вперед и, молодецки салютуя, осадил лошадь перед государем.
– С Богом, генерал, – сказал ему государь.
– Ma foi, sire, nous ferons ce que qui sera dans notre possibilite, sire, [Право, ваше величество, мы сделаем, что будет нам возможно сделать, ваше величество,] – отвечал он весело, тем не менее вызывая насмешливую улыбку у господ свиты государя своим дурным французским выговором.
Милорадович круто повернул свою лошадь и стал несколько позади государя. Апшеронцы, возбуждаемые присутствием государя, молодецким, бойким шагом отбивая ногу, проходили мимо императоров и их свиты.
– Ребята! – крикнул громким, самоуверенным и веселым голосом Милорадович, видимо, до такой степени возбужденный звуками стрельбы, ожиданием сражения и видом молодцов апшеронцев, еще своих суворовских товарищей, бойко проходивших мимо императоров, что забыл о присутствии государя. – Ребята, вам не первую деревню брать! – крикнул он.
– Рады стараться! – прокричали солдаты.
Лошадь государя шарахнулась от неожиданного крика. Лошадь эта, носившая государя еще на смотрах в России, здесь, на Аустерлицком поле, несла своего седока, выдерживая его рассеянные удары левой ногой, настораживала уши от звуков выстрелов, точно так же, как она делала это на Марсовом поле, не понимая значения ни этих слышавшихся выстрелов, ни соседства вороного жеребца императора Франца, ни всего того, что говорил, думал, чувствовал в этот день тот, кто ехал на ней.
Государь с улыбкой обратился к одному из своих приближенных, указывая на молодцов апшеронцев, и что то сказал ему.


Кутузов, сопутствуемый своими адъютантами, поехал шагом за карабинерами.
Проехав с полверсты в хвосте колонны, он остановился у одинокого заброшенного дома (вероятно, бывшего трактира) подле разветвления двух дорог. Обе дороги спускались под гору, и по обеим шли войска.
Туман начинал расходиться, и неопределенно, верстах в двух расстояния, виднелись уже неприятельские войска на противоположных возвышенностях. Налево внизу стрельба становилась слышнее. Кутузов остановился, разговаривая с австрийским генералом. Князь Андрей, стоя несколько позади, вглядывался в них и, желая попросить зрительную трубу у адъютанта, обратился к нему.
– Посмотрите, посмотрите, – говорил этот адъютант, глядя не на дальнее войско, а вниз по горе перед собой. – Это французы!
Два генерала и адъютанты стали хвататься за трубу, вырывая ее один у другого. Все лица вдруг изменились, и на всех выразился ужас. Французов предполагали за две версты от нас, а они явились вдруг, неожиданно перед нами.