Домой Edit me on GitHub

2020-12-05

Каналы передачи данных | Сетевое программирование | Базы данных | Основы Веб-программирования

Введение

../../../_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

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

Импорты

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

helloworld.py - функция hello
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.

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: Конфигурация