Pyramid (веб-фреймворк)
Pyramid (англ. pyramid — пирамида) — программный каркас (фреймворк) для разработки веб-приложений с открытым исходным кодом, написанный на языке Python в рамках проекта Pylons[3]. ИсторияНа создание Pyramid оказали влияние такие фреймворки, как Zope, Pylons и Django. Код Pyramid разрабатывался в проекте repoze.bfg, а название поменялось в результате слияния проектов BFG и Pylons.[4] Основные принципы и понятияДизайн Pyramid основан на следующих принципах[5]:
В защиту своего дизайна авторы Pyramid написали довольно большой документ, который призван развеять мифы о фреймворке. Например, на критику модели MVC в Pyramid следует подробное объяснение, что MVC «притянут за уши» к веб-приложениям. Следующая цитата[6] хорошо характеризует подход к терминологии в Pyramid:
ВозможностиОсновными преимуществами Pyramid являются[5]:
Использование каркаса для разработки приложенияХотя не составляет большой трудности написать Pyramid-приложение (проект) с нуля, Pyramid имеет инструменты для инициализации кода нового приложения по выбранному шаблону, или, в терминологии Pyramid, каркасной структуре (англ. scaffolds[8]). Например, в поставке имеются каркасные структуры для проектов, использующих 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
Приведённую структуру, как следует из документации, не следует сильно изменять, так как это может помешать другим разработчикам быстро ориентироваться в коде проекта[9]. Тем не менее, растущий проект может потребовать некоторых изменений. Например, виды, модели (если они используются) и тесты можно, разбив на модули, перенести соответственно в подкаталоги views, models и tests (не забыв снадбить их файлом Проект может, например, находиться в составе buildout (скажем, в каталоге src), который собирает все необходимые компоненты вместе. Совсем необязательно, чтобы Pyramid-проект состоял из одного пакета. Величина проекта ограничивается только достаточностью знаний разработчиков о возможностях Pyramid[10]. 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()
В этом примере иерархия для обхода жестко задана в методе КонфигурированиеКонфигурирование приложения, то есть, задание настроек, влияющих на его работу, может осуществляться в Pyramid двумя способами: императивным и декларативным. Императивное конфигурирование производится вызовами методов конфигуратора непосредственно перед стартом приложения. Декларативное конфигурирование задается декораторами видов. Перед запуском приложение «сканируется» на предмет конфигурационных параметров
методом from pyramid.response import Response
from pyramid.view import view_config
@view_config(name='hello', request_method='GET')
def hello(request):
return Response('Hello')
Оба метода конфигурирования полностью взаимозаменяемы.[12] Желающие могут использовать для конфигурирования ZCML, установив соответствующий пакет. Генерация HTMLВ Pyramid можно использовать различные движки для генерации HTML. Так, Chameleon и Mako входят в поставку.[13] Кроме них, можно подключить и другие, например, Jinja2. Работа с формами может осуществляться, например, с помощью троицы Peppercorn-Colander-Deform. ПримерОдно из наиболее простых приложений для Pyramid[14]: 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()
Применение
Примечания
Ссылки
Литература
|
Portal di Ensiklopedia Dunia