На создание Pyramid оказали влияние такие фреймворки, как Zope, Pylons и Django. Код Pyramid разрабатывался в проекте repoze.bfg, а название поменялось в результате слияния проектов BFG и Pylons, по решению встречи разработчиков в отеле Luxor (который имеет форму пирамиды, откуда и пошло название фреймворка) в Лас-Вегасе, в 2010 году.
См.также
Пирамида — самый молодой фреймворк для синхронного Веба среди популярных
Python фреймворков. Разработчики из сообщества Pylons не стали развивать тупиковую ветвь каркасных
фреймворков с жестко заданной архитектурой, к которым относятся Pylons и
например Ruby On Rails, поняли ошибки монолитных тяжелых фреймворков типа
Zope или Django и создали минималистичный, очень гибкий, но, в то же
время, легко расширяемый инструмент, сконцентрировав свои усилия на основных
задачах фреймворка, как: обработка маршрутов, простой и расширяемый конфиг,
система событий и middleware (tweens), простая система авторизации
построенная на ACL, возможность задания маршрутов динамически в виде
бинарного дерева и привязки их к ресурсам. Всеми остальными задачами занимаются
сторонние библиотеки. По требованию программиста можно выбрать любой ORM
для работы с БД, любой шаблонизатор, придумать любую схему авторизации и прочее.
Такой подход не ограничивает программиста в архитектуре проекта, в выборе инструментов и не заставляет для решения узких задач тянуть множество ненужных зависимостей и функционала.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
def hello(request):
return Response('Hello world!')
if __name__ == '__main__':
config = Configurator()
config.add_route('hello_world', '/')
config.add_view(hello, route_name='hello_world')
app = config.make_wsgi_app()
server = make_server('0.0.0.0', 8000, app)
server.serve_forever() |
Сохраните код в файл helloworld.py
и запустите его (python
helloworld.py
). Теперь приложение доступно на 8000 порту. По адресу
http://localhost:8000/ отобразится «Hello World».
Так просто, в одном файле, запустить Веб приложение не получится ни в Django, ни в Zope, это можно сравнить разве что с WSGI приложением или минималистичным фреймворком Bottle, который сильно уступает пирамиде по возможностям масштабирования.
from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
Pyramid приложение начинается с конфига, который создается при помощи класса
Configurator
из модуля pyramid.config
.
В дальнейшем, экземпляр класса Configurator
используется для настройки.
Как и многие другие Веб-фреймворки на Python, Pyramid использует WSGI
протокол для связи приложения и веб-сервера. В этом примере выбран
Веб-сервер wsgiref
для удобства, т.к. он встроен в Python.
pyramid.response.Response
копия класса Response
из библиотеки webob. Используется для формирования HTTP ответа.
def hello(request):
return Response('Hello world!')
Такой тип представления в Pyramid называется view callable, принимает в
качестве аргумента объект класса pyramid.request.Request
(который
наследуется от webob.request.BaseRequest
) и возвращает объект HTTP
ответа pyramid.response.Response
.
config = Configurator()
1 2 | config.add_route('hello_world', '/')
config.add_view(hello, route_name='hello_world') |
В первой строчке вызывается метод конфигуратора
pyramid.config.Configurator.add_route()
, который регистрирует новый
маршрут (route) с названием «hello_world» и привязывает его к корневому
пути сайта «/».
Вторая строка регистрирует функцию hello(request)
как view callable
и привязывает ее к маршруту «hello_world». Теперь при обращении по URL адресу
http://localhost:8000/ будет запускаться функция hello
с переданным ей
объектом запроса request
.
1 | app = config.make_wsgi_app() |
Метод pyramid.config.Configurator.make_wsgi_app()
формирует WSGI
приложение из информации, которая хранится в конфигураторе. В дальнейшем,
благодаря спецификации WSGI (PEP 333), можно запустить это приложение на
любом совместимом Веб-сервере.
1 2 | server = make_server('0.0.0.0', 8000, app)
server.serve_forever() |
WSGI-сервер wsgiref
принимает первым параметром адрес „0.0.0.0“
(доступен извне, в отличие от „127.0.0.1“ по умолчанию), вторым — порт „8000“,
третий параметр — это WSGI-приложение, в пирамиде конечное приложение является
объектом класса pyramid.router.Router
(Router).
Функция serve_forever
запускает WSGI приложение.
Мы написали очень простое Веб-приложение используя Pyramid фреймворк и
настроив его императивно, это означает что настройки были прописаны напрямую в
объект конфигуратора (класс pyramid.config.Configurator
).