Домой Edit me on GitHub

2017-09-19

Введение

../../../_images/Pyramid_Logo.svg

На создание Pyramid оказали влияние такие фреймворки, как Zope, Pylons и Django. Код Pyramid разрабатывался в проекте repoze.bfg, а название поменялось в результате слияния проектов BFG и Pylons, по решению встречи разработчиков в отеле Luxor (который имеет форму пирамиды, откуда и пошло название фреймворка) в Лас-Вегасе, в 2010 году.

См.также

Пирамида самый молодой фреймворк для синхронного Веба, среди популярных Python фреймворков. Разработчики из сообщества Pylons не стали развивать тупиковую ветвь каркасных фреймворков с жестко заданной архитектурой, к которым относятся Pylons и например Ruby On Rails, поняли ошибки монолитных, тяжелых фреймворков типа Zope или Django и создали минималистичный, очень гибкий, но в то же время легко расширяемый фреймворк, сконцентрировав свои усилия на основных задачах фреймворка, это обработка маршрутов, простой и расширяемый конфиг, система событий и middleware (tweens), простая система авторизации построенная на ACL, возможность задания маршрутов динамически в виде бинарного дерева и привязки их к ресурсам. Всеми остальными задачами занимаются сторонние библиотеки, по требованию программиста, можно выбрать любой ORM для работы с БД, любой шаблонизатор, придумать любую схему авторизации и прочее.

Такой подход не ограничивает программиста в архитектуре проекта, в выборе инструментов и не заставляет для решения узких задач тянуть множество не нужных зависимостей и функционала.

Hello World

Код 94 helloworld.py - Pyramid приложение в одном файле
 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, который сильно уступает пирамиде по возможностям масштабирования.

Импорты

Код 95 helloworld.py - импортированные модули
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 ответа.

View

Код 96 helloworld.py - функция hello
def hello(request):
    return Response('Hello world!')

Такой тип представления в Pyramid называется view callable, принимает в качестве аргумента объект класса pyramid.request.Request (который наследуется от webob.request.BaseRequest) и возвращает объект HTTP ответа pyramid.response.Response.

Конфигурация

Код 97 Создаем конфигуратор приложения
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.

WSGI приложение

1
app = config.make_wsgi_app()

Метод pyramid.config.Configurator.make_wsgi_app() формирует WSGI приложение из информации которая хранится в конфигураторе. В дальнейшем, благодаря спецификации WSGI (PEP 333), можно запустить это приложение на любом совместимом Веб-сервере.

WSGI сервер

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).

Previous: Фреймворк Pyramid Next: Конфигурация