Готовый перевод Pyramid Documentation / Документация Pyramid: narr/firstapp.rst
Ваше первое приложение :app:Pyramid
===============================
В этой главе мы сделаем небольшое приложение :app:Pyramid. После этого мы детально обсудим его работу.
Hello World, Goodbye World
--------------------------
Вот совсем простое приложение :app:Pyramid, сконфигурированное императивно.
Если назвать этот скрипт helloworld.py и запустить его в интерпретаторе Python, то на порту 8080 запуститься веб-сервер :
Если зайти на корневую страничку (/), нашего сервера localhost:8080, мы увидим надпись "Hello world !". Если же зайти на страничку /goodbye, мы увидим надпись "Goodbye world !".
Нажатие Ctrl-C закроет программу.
А теперь рассмотрим в деталях, что делает это приложение.
Импорты
~~~~~~~
Скрипт helloworld.py импортирует следующее :
Он импортирует :class:~pyramid.config.Configurator из модуля :mod:pyramid.config. Экземпляр этого класса, будет использован для конфигурации вашего приложения.
Класс :class:pyramid.response.Response будет использован при создании объекта :term:response.
Как многие другие веб-фреймворки, :app:Pyramid использует протокол :term:WSGI для взаимодействия в веб сервером. Сервер :mod:paste.httpserver - это удобный пример WSGI сервера.
Определения видов-для-вызова
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
В скрипте, кроме импортированния, были определенны две функции hello_world и goodbye_world.
Они не делают ничего сложного. Обе принимают один аргумент. Эти функции не выполняют никаких действий, но возвращают экземпляр :class:Response, со значениями "Hello world!" для функции hello_world и "Goodbye world!" для goodbye_world.
Такие функции называются :term:view callable. View callable обрабатывает один аргумент request. Она должна возвращать ответ :term:response. View callable не обязана быть функцией. Она может быть другой сущностью, например классом, но мы пока будем говорить только о функциях.
Объект :term:request (от которого вызывается view callable), это форма представления HTTP запроса полученного :app:Pyramid с помощью активного WSGI сервера.
View callable возвращает обьект :term:response, из которого строится ответ HTTP; этот объект будет преобразован в обыкновенный текст активным WSGI сервером и отослан в HTTP ответе, браузеру пользователя.
Каждый view callable создает объект :class:~pyramid.response.Response и возвращает его как свой ответ.
Функция hello_world добавляет строку "Hello world!" в конструктор Response.
.. note:: Как мы увидим в следующих главах, возвращение Response обьекта не обязательно; вместо этого можно настроить использование :term:renderer. Если мы используем :term:renderer, то view callable может возвращать любое значение, воспринимаемое его рендером. А уже рендер преобразует это значение в готовый Response обьект.
Конфигурация приложения
~~~~~~~~~~~~~~~~~
Следующий код определяет *конфигурацию* данного приложения. Оно конфигурируется, с использованием уже определенных и импортированных функций и классов.
Рассмотрим это поподробнее...
Создание Конфигуратора
~~~~~~~~~~~~~~~~
Код if __name__ == '__main__': - это одна из идиом Python : код за ifбудет выполнен, только при запуске приложения напрямую из командной строки.
helloworld.pyможно рассматривать как модуль Python. Использование этой идиомы - хорошая идея; если этот модуль будет импортирован другим модулем Python, то код внутри if не будет выполнен.
Строка config = Configurator(), создает объект класса config = Configurator().
Полученный объект config дает API, нужный для конфигурации приложения .
Конфигурированние
~~~~~~~~~~~~~
Каждая из этих строк вызывает метод :meth:pyramid.config.Configurator.add_view.
Метод add_view добавляет :term:view configuration в :term:регистр приложения/ :term:View configuration определяет какой :term:view callable будет вызван при определенном запросе. Эти соответствия задаются аргументами метода add_view.
Линия config.add_view(hello_world). Эта строка вызовет метод add_view со стандартным значением атрибута name (пустой строкой: ""). Это установит правило, вызывать hello_world", каждый раз когда :term:view name является пустой строкой. Мы узнает позже, что такое :term:view name; в даном случае hello_world будет вызываться при запросе адреса "/" браузером.
Строка config.add_view(goodbye_world, name='goodbye') регистрирует функцию goodbye_world как вид-для-вызова. В этой строке add_view указывает вид-для-вызова первым позиционным аргументом и :term:предикат - именованный аргумент name со значением 'goodbye'. Аргумент name в этой :term:концигурации вида подразумевает, что только запрос с :term:именем вида, равным goodbye, должен вызвать вид-для-вызова goodbye_world. В частности, это означает, что при посещении браузером веб-адреса /goodbye будет вызвана именно функция goodbye_world.
Каждый вызов метода add_view регистрирует одну :term:конфигурацию вида. Каждый :term:предикат, данный именованным параметром метода add_view, сужает набор обстоятельств, при которых вид будет вызван. Вообще, чем больше задано предикатов при конфигурировании вида, тем более строго ограничивается применимость соответствующего вида-для-вызова. Когда :app:Pyramid обрабатывает запрос, будет применён вид-для-вызова с *наиболее специфичной* конфигурацией (конфигурацией, которая соответствует наиболее частному набору предикатов).
В этом приложении :app:Pyramid выбирает наиболее специфичный вид-для-вызова (view callable) сугубо на основании применимости :term:предиката к виду. Порядок вызовов :meth:~pyramid.config.Configurator.add_view никогда не является очень важным. Мы можем зарегистрировать goodbye_world до hello_world, но :app:Pyramid всё равно даст нам наиболее специфичный вид-для-вызова при диспетчеризации запроса.
Создание WSGI приложения
~~~~~~~~~~~~~~~~~~~~~
После окончания конфигурирования видов и завершения конфигурации скрипт создает WSGI-приложение с помощью метода :meth:pyramid.config.Configurator.make_wsgi_app. Вызов make_wsgi_app подразумевает, что конфигурирование закончено, то есть, вызовы всех методов конфигуратора для настройки видов завершены, все другие конфигурационные процедуры выполнены. Метод make_wsgi_app возвращает объект с WSGI-приложением, который может быть использован любым WSGI-сервером для работы с приложением по обработке запросов. WSGI - это протокол, который позволяет серверам общаться с приложениями на Python. Здесь мы не будем вдаваться в подробности - узнать побольше о протоколе :term:WSGI можно на сайте wsgi.org
/wsgi.org>_.
Объект-приложение :app:Pyramid является в частности экземпляром класса, представляющим :app:Pyramid диспетчер (:term:router). Он имеет ссылку на :term:реестр приложения, который образовался в результате проделанных вызовов методов конфигуратора. Этот диспетчер образается к реестру и подчиняется правилам выбора, сделанным конкретным приложением. Эти правила выбора были сообщены ранее при вызовах :term:Configurator. В нашем случае правила были указаны двумя вызовами метода add_view.
Сервер WSGI-приложения
~~~~~~~~~~~~~~~~~~~~~~
Наконец, обслуживание запросов приложением начинается с запуском WSGI-сервера. Здесь мы использовали функцию запуска WSGI-сервера :func:paste.httpserver.serve, с предоставлением ей объекта app (:term:router) в качестве приложения. Мы также использовали аргумент host=='0.0.0.0', означающий: "слушай на всех интерфейсах TCP." По умолчанию HTTP-сервер Paste слушает только интерфейс 127.0.0.1, что не позволяет получить прямой доступ к сервису по сети с другого хоста, а только локально. Мы не указываем используемый порт TCP, что приводит к использованию порта по умолчанию 8080.
По этой команде сервер начнёт слушать TCP-порт 8080. Он будет обрабатывать запросы бесконечно, пока мы не уничтожим серверный процесс, например, комбинацией клавиш Ctrl-C на терминале, с которого мы его первоначально запустили.
Заключение
~~~~~~~~~~
Наше приложение "Здравствуй, мир!" - одно из наиболее простых возможных приложений для :app:Pyramid, сконфигурированное "императивно". Императивный стиль даёт нам всю мощь языка Python для выполнения задач конфигурирования.
Ссылки
~~~~~~
За более подробной информацией об API объекта :term:Конфигуратор см. :class:~pyramid.config.Configurator .
Подробнее о :term:конфигурировании видов см.
:ref:view_config_chapter.
Пример использования *декларативного* конфигурирования (:term:ZCML) вместо императивного для того же сомого приложения "hello world" находится в документации к :term:pyramid_zcml.
Переведено на Нотабеноиде
http://notabenoid.org/book/17677/65871
Переводчики: uhbif19, rnd0011
Настройки
Готово:
