## page was renamed from Книги/The_Definitive_Guide_to_Pylons/Введение_в_Pylons = 1. Введение в Pylons = Эта книга о Pylons, захватывающем современном фреймворке для веб-разработок, который позволяет поставить разработчика в твердые рамки и делает процесс построения веб-приложений настолько легким, насколько это возможно. Популярность Pylons очень выросла за последние годы из-за точного баланса между мощными особенностями разработки и его модульной внутренней архитектурой, что помогает разработчикам быстро создавать сложные веб-приложения без сокрытия того, что реально происходит ”за кулисами”. Pylons дает Вам возможности, которые нужны для эффективного создания веб-сайтов и веб-приложений, в то же время обладая достаточной гибкостью для того, чтобы позволить Вам осуществлять действия по-другому, когда это действительно необходимо. Разработчики Pylons очень тщательно обдумали лучший способ структурирования веб-приложений так, что от использования Pylons вы извлекаете выгоду из всех знаний и опыта тех разработчиков, и можете сконцентрироваться на работе по созданию Вашего приложения и потратить меньше времени, фокусируясь на компонентах фреймворка, которые Ваше приложение будет использовать. Вместо того чтобы создать фреймворк, основанный на составных компонентах, Pylons полагается из-за своей легкости на самостоятельные компоненты, свободно присоединяемые с помощью четко определенных интерфейсов прикладных программ (API). Это означает, что вместо того, чтобы быть ограниченными набором компонентов, выбранным создателями фреймворка, разработчики Pylons могут свободно выбирать лучшие компоненты для своих индивидуальных требований. В результате, первые разработчики, которых привлекал Pylons, по тенденции были людьми с большим опытом разработки или людьми, которые написали свои собственные веб-фреймворки Python, потому что они могли осознать выгоду гибкого подхода Pylons. Спустя время по мере того как Pylons становился более известным, Pylons привлек также и менее опытных программистов. Цель этой книги – обратиться к обеим категориям разработчиков. Первая часть этой книги ставит целью обеспечить Вас всеми теми знаниями, которые потребуются чтобы начать использовать стандартную конфигурацию Pylons для построения высококачественных по продуктивности веб-сайтов. В части 2 Вы узнаете о некоторых более передовых особенностях Pylons, таких как Юникод и поддержка интернационализации, Ajax и маршрутизация URL перед тем, как перейти к части 3, которая охватывает темы для экспертов, такие как шлюзовый интерфейс веб-сервера, аутентификация и авторизация, развертывание и регистрация. Каждая глава будет выступать полным руководством по каждой из охваченных тем и будет содержать ссылки на области, куда Вы сможете обратиться за дальнейшей информацией. На протяжении всей книги мы также разработаем простое веб-сайтовое приложение под названием !SimpleSite так, что Вы сможете увидеть, как принципы, описанные в каждой из глав, применяются в реальном приложении Pylons. == Старый способ: CGI-скрипты == Для того, чтобы понять, что именно представляет из себя Pylons и как он отличается от других фреймворков, мы взглянем на простой Python CGI-скрипт и проанализируем плюсы и минусы CGI-подхода. Затем мы посмотрим, как Pylons и другие фреймворки используют то, что должны предлагать CGI-скрипты. Наконец мы рассмотрим, как Pylons опережает другие фреймворки, предлагая для манипуляций модульные API, которые Вы можете использовать для расширения или изменения Pylons в своих собственных целях, когда традиционные настройки веб-фреймворка не полностью удовлетворяют Вашим потребностям. В прошлом разработчики, как правило, писали веб-приложения как последовательность простых скриптов, каждый их которых отвечал за доступ к тем данным в базе, которые были ему необходимы, за генерацию HTML для вывода страниц как результата работы скрипта и за связующий код, благодаря которому выполнялось приложение. Написать каждый отдельный скрипт было быстро, а понять - легко для опытного разработчика, который видел код в первый раз, потому что все, относящееся к генерации отдельной страницы, находилось в одном скрипте. Разработчики имели прямой доступ посредством SQL к используемой базе данных и обладали возможностью и гибкостью написания кода каким угодно способом, подходящим для их нужд. Вот простой пример того способа, который обычно применялся при написании CGI-скриптов: {{{#!highlight python #!/usr/bin/env python # Получение конфигурации для скрипта import ConfigParser config = ConfigParser.ConfigParser() config.read('/path/to/config.ini') # Если отладка разрешена, установить модуль cgitb if config.get('general', 'debug') == 'on': import cgitb; cgitb.enable() # Начало импортов, не зависимых от конфигурации import cgi import MySQLdb import os # Вывод HTTP-заголовков print "Content-type: text/html\n\n" # Вывод "шапки" HTML-страницы print "
Here are the comments:
" # Получение идентификатора из URL, основанного на переменной # окружения QUERY_STRING, используя cgi-модуль fields = cgi.FieldStorage() page = int(fields['page'].value) # Выборка данных из базы connection = MySQLdb.connect( db=config.get('database', 'database'), user=config.get('database', 'user'), passwd=config.get('database', 'password'), host=config.get('database', 'host') ) cursor = connection.cursor() cursor.execute("SELECT id, data FROM comment WHERE page=%s", (page,)) results = cursor.fetchall() cursor.close() connection.close() # Вывод комментариев for id, data in results: print "Commment #%s: %s
"%(id, cgi.escape(data)) # Вывод остальной HTML-страницы print "" }}} Скрипт отображал список комментариев тогда, когда был введен такой URL, как /cgi-bin/test.cgi?page=1. Вам также был нужен конфигурационный файл, который представлял собой что-то наподобие этого: {{{ [general] debug = off [database] database = dbname host = localhost user = james password = somepassword }}} Код CGI-скрипта не такой изящный, каким бы он мог быть, но у него действительно есть некоторые достоинства. Давайте взглянем на плюсы и минусы. Сначала плюсы: * Тот, кто понимает HTTP-протокол и SQL, вероятно, будет в состоянии понять большую часть этого кода, потому что в нем используются стандартные техники веб-разработки * Кодирование этим способом предоставляет разработчику огромное количество возможностей, так как разработчики обладают контролем над каждым видом HTTP-ответа и могут писать настолько сложные SQL-запросы, насколько захотят. Сейчас некоторые из минусов: * Каждый скрипт на сайте нуждается в аналогичном коде, чтобы загружать конфигурационный файл и обрабатывать ошибки * Написание кода доступа к базе данных очень часто повторяется, а структуры данных из базы не обязательно представляют объекты, с которыми Ваше приложение захочет иметь дело * CGI-скрипты могут быть медленными, потому что весь интерпретатор Python в целом, как и модули, используемые скриптом, требуют загрузки в память на каждом запросе * Дизайнерам покажется сложной смена темы сайта, так как код, генерирующий HTML, перемежается с кодом Python Существуют также некоторые более тонкие проблемы при создании целого приложения как последовательности скриптов: * Код часто дублируется в многочисленных скриптах * Со временем может стать трудно сопровождать код, так как разработчики меняют базу данных или код в определенных файлах, но не знают того, что другие скрипты также зависят от способа работы базы данных или кода до изменений. * Может быть сложно понять, как структурировано приложение в целом, потому что каждый скрипт может вести себя достаточно автономно * URL-адреса в форме /cgi-bin/path/to/script.cgi?controller=page&action=view&id=3 не всегда отражают структуру Вашего веб-приложения и не так естественны для пользователя, как такой URL, как /page/view/3. Для решения этих проблем Pylons (равно как и другие популярные фреймворки, такие как Django, !TurboGears и Ruby on Rails) использует два основных способа: * Архитектура "модель-представление-контроллер" (Model View Controller) * Соглашения по конфигурации (Convention over configuration) Pylons также придает особое значение: * Слабому связыванию и четкому разделению Мы рассмотрим каждую из этих идей в следующих разделах. == Архитектура "модель-представление-контроллер" (Model View Controller) == Паттерн (шаблон проектирования) "модель-представление-контроллер" (Model View Controller) - это результат признания того, что по своей сути, большинство веб-приложений полагаются на способность: * хранения и поиска данных способом, являющимся естественным для используемого языка программирования (модель) * представления данных различными способами, наиболее распространенно в виде HTML страниц (представление) * написания логики кода для обработки данных и управления их взаимодействием (контроллеры) В Pylons каждый из этих компонентов хранится отдельно. Запросы направляются к контроллеру, который является обыкновенным Python классом с методами, называемыми действиями, осуществляющими оперирование логикой приложения. Контроллер взаимодействует с классами модели для выборки данных из базы. После того, как вся необходимая информация собрана, контроллер передает ключевую информацию шаблону представления, где HTML-представление данных генерируется и возвращается в браузер пользователя. Пользователь затем взаимодействует с представлением, чтобы создать новый запрос, и процесс начинается заново. Модель и контроллер не содержат код для генерации HTML и не должны взаимодействовать напрямую с моделью подобно шаблонам представления. Эта архитектура очень успешна, потому что она не только отражает то, что происходит в большинстве веб-приложений, но также обеспечивает легкость поддержки Вашего приложения, так как Вы всегда знаете, где можно найти код, управляющий определенной стороной Вашего приложения. Например, Pylons использует язык шаблонов, называемый Mako, с целью помочь Вам с генерацией HTML и рекомендует объектно-реляционный преобразователь данных SQLAlchemy, чтобы оказать Вам помощь с моделью. Вы узнаете намного больше о моделях, контроллерах и представлениях в следующих разделах. {{{{#!wiki warning '''Осторожно''' Те из вас, кто переходят к Pylons от Django, могли привыкнуть к подходу Django к архитектуре "модель-представление-контроллер" MVC (Model View Controller), которую они называют MTV (Model/Template/View)-"модель-шаблон-представление". Хотя концептуально архитектура довольна похожа на традиционный подход Pylons к MVC, существуют две ключевые разницы в терминологии: * Шаблон Django эквивалентен представлению Pylons * Представление Django равносильно контроллеру Pylons * Модель обрабатывается одинаково как в Django, так и в Pylons. На веб-сайте Django по адресу http://tinyurl.com/mnwg9 есть обсуждение причин Django на его терминологию. }}}} == Соглашения по конфигурации (Convention Over Configuration) == Большинство сложностей веб-разработки может быть устранено путем предположения, что разработчик желает предпринять наиболее очевидную вещь. Например, почти каждый раз, когда пользователь запрашивает страницу с Вашего сайта, Вам хочется возвратить простую HTML-страницу. Могут быть случаи, когда Вы захотите вернуть изображение или, возможно, поток пользовательских бинарных данных, но большую часть времени простая HTML-страница - это все, что требуется. Имея это в виду, разработчики Pylons спроектировали фреймворк так, что автоматически предполагается, что когда Вы возвращаете данные, то это HTML данные, если Вы не укажете обратное. Это означает, что в общих случаях Вам не нужно настраивать Content-type, потому что по соглашению он будет text/html, если Вы не захотите изменить положение вещей. == Слабое связывание и четкое разделение == Веб-фреймворки, такие как Django и Ruby on Rails стали невероятно популярны за последние годы, потому что они обеспечивают структуру, которая возволяет Вам быстро создать красивые веб-сайты, определяя способ структурирования данных. Инструменты, которые они предоставляют, затем осуществляют работу над теми данными с целью либо автоматически генерировать код (scaffold в случае Ruby on Rails), либо создавать интерфейсы форм во время выполнения (как в случае с Django). Хотя эти фреймворки поддерживают четкое разделение между уровнями кода модели, представления и контроллера, они не так слабо связаны, как Pylons, потому что способность приложения в целом работать в значительной степени зависит от связующего кода, находящегося в самом фреймворке. Хотя может быть очень легко написать простое приложение с помощью этих фреймворков, труднее может оказаться их поведенческая настройка позднее в проекте, потому что это часто включает в себя понимание того, как работает код, предлагаемый самим фреймворком, перед тем как Вы сможете изменить его режим. Для того чтобы сделать сам фреймворк легким в использовании, код фреймворка иногда должен быть довольно сложным, и в результате настройка может быть иногда довольно трудоемкой. С одной стороны Pylons гораздо более слабо связан. По причине того, что он не предлагает инструментов для автоматической генерации почти законченного сайта для Вас из определения модели, он не требует сложного связующего кода, управляющего всем вместе. Вместо этого он предоставляет разумные низкоуровневые API и методологии, которые позволяют Вам быстро и легко связывать вместе составные части, которые Вы выбираете, чтобы использовать для себя. Тем не менее, этот слабосвязанный подход не означает, что Вы должны кодировать абсолютно все для себя. Pylons использует соглашения по конфигурации (Convention Over Configuration) и допускает, что Вы захотите использовать стандартную схему при создании нового проекта. Если Вы не хотите стандартную схему, способ работы Pylons легко настроить. Например, по умолчанию Pylons использует структуру шаблонов, называемую Mako, чтобы помочь Вам генерировать шаблоны для Ваших представлений, но Вы не обязаны использовать ее. Путем настройки Вашего Pylons проекта Вы можете с легкостью использовать любой другой из главных языков шаблонов Python, включая Genshi, TAL или Breve, и все работают одинаково хорошо, потому что Pylons взаимодействует с каждым через стандартный API. == Другие возможности == В дополнение к обработке модели, представлений и контроллеров, современные веб-фреймворки также должны предоставлять инструменты для облегчения каждого из следующих процессов: * преобразование URL, который посещает пользователь, в подлежащий выполнению код * чтение данных, таких как post-данные формы, отсылаемые посредством HTTP * проверка и повторное заполнение форм * обращение с учетными записями пользователей * хранение информации по сессиям, возможно, используя cookie * программирование клиентской стороны, включая схемы CSS и AJAX Также они часто обеспечивают: * Компонент сервера для запуска приложения * Инструменты для автоматической генерации документации * Системы для создания пакетов программ, распространения и развертывания * Инструменты для тестирования * Инструменты для интернационализации и поддержки Юникода * Интерактивные инструменты для отладки * Средства для регистрации * Любое количество других полезных возможностей Pylons не является исключением и предоставляет инструменты и методологии для управления всеми этими вещами. Вы узнаете о каждом из них в продолжение курса книги. == Язык Python == Python - это превосходный язык для широчайшего круга задач программирования. Его легко выучить, и кроме того, он является достаточно мощным и выразительным для выполнения всех стилей работ. Он также замечателен для веб-программирования (имеются веские основания для того, что он является одним из трех официальных языков в Google). Однако, возможно, его ключевое достоинство заключается в том, что Python обладает большой поддержкой во всех популярных платформах, включая BSD, Linux, MacOS X и Windows и огромный ассортимент программных библиотек, уже доступных для использования, так что в большинстве своем Вы сможете найти подходящий инструмент для работы, которую Вы пытаетесь успешно выполнить, без необходимости написания его самому. Если Вы еще не выучили Python, сейчас подходящее время для прочтения учебника по Python по адресу http://docs.python.org/tut/tut.html, который даст Вам все те знания, которые будут необходимы, чтобы начать разработку приложений при помощи Pylons. Другой хороший источник информации для изучения Pylons - это книга Марка Пилгрима "Углубляемся в Python" (Dive Into Python), изданная в 2004. Она свободно доступна онлайн по адресу http://www.diveintopython.org/toc/index.html и немного более подробно предоставляет самообучение Python. == Python 3.0 == Python 3.0 - это новая версия языка программирования Python, которая в настоящее время находится в альфа-релизе. В отличие от последних обновлений языка программирования Python, Python 3.0 не будет поностью обратно совместим с предыдущими версиями, так что вполне вероятно, что код, написанный для Pylons на данный момент, не будет автоматически работать с Python 3.0. К счастью, это не является проблемой, которая должна Вас очень волновать, по двум причинам: * Изменения в Python 3.0 в известной степени маленькие, так что будет довольно легко модернизировать Ваш код * Команда языка Python будет продолжать выпускать 2.x версии Python после выпуска 3.0 * Будет доступен инструмент для автоматической трансляции исходных файлов Python из 2.x на 3.x и он будет управлять большинством необходимых преобразований. Если Вы заинтересованы, текущая версия разработки находится по адресу http://svn.python.org/projects/sandbox/trunk/2to3/ Как только обнаружится достаточный спрос на Python 3.0 версию Pylons и достаточно зависимостей Pylons будет обновлено, команда Pylons планирует выпустить пару одинаковых по возможностям версий Pylons, одну для Python 2.6 и одну для Python 3.0 в соответствии с текущей рекоммендацией сообщества Python. Python 2.6 будет включать возможность печати предупреждающих сообщений о любом коде, не совместимом с Python 3.0, так что Вы сможете запустить Ваш код на Pylons для Python 2.6, чтобы узнать, где могут быть какие-то проблемы, и затем после внесения изменений или запуска инструмента рефакторинга из2на3 Вы сможете запустить Ваш код на Pylons для Python 3.0. == Сообщество Pylons == Основная выгода при выборе Pylons заключается в том, что существует процветающее и успешное сообщество, построенное вокруг него. Стать активным членом сообщества Pylons легко, и мы всегда стремимся к увеличению количества участников сообщества. Кроме официальной документации существует также сборник рецептов Pylons, который содержит внесенную пользователями документацию в рамках вики Pylons. Сообщество всегда приветствует новые вложения в книгу рецептов или комментарии к существующим статьям, и если Вы зарегистрируетесь на вики, то можете даже осуществлять экспорт в PDF путем нажатия на иконку PDF в верхней правой части страниц, чтобы взять с собой в дорогу. Вики Pylons: http://wiki.pylonshq.com/ Официальная документация: http://wiki.pylonshq.com/display/pylonsdocs/ Сборник рецептов: http://wiki.pylonshq.com/display/pylonscookbook/ Для более непосредственной помощи, всегда действует почтовая рассылка обсуждения Pylons в группах Google (Google Groups), и обычно на Pylons freenode канале в IRC сидит довольно много людей, которые также рады Вам помочь. IRC: #pylons во freenode Почтовая рассылка: http://groups.google.com/pylons-discuss == Компоненты Pylons == В отличие от других фреймворков, где каждый компонент обычно встроен во фреймворк, а затем тесно объединен с другими компонентами фреймворка, Pylons более похож на коллекцию очень внимательно выбранных, разработанных третьей стороной программ. Вместо того, чтобы начинать с росписи на каждом из компонентов, составляющих Pylons, разработчики сотрудничали с существующими коллективами программистов, чтобы проектировать стандарты и API, которые позволят их программному обеспечению работать с Pylons. Этот подход оказывается чрезвычайно полезным и имеет три основных преимущества: * API и методологии, которые позволяют Pylons работать с одним классом компонентов, скажем, с объектно-реляционными преобразователями, также подразумевают то, что когда выходит более новое и лучшее программное обеспечение, задача сделать возможной работу Pylons с новым программным обеспечением при использовании тех же API и методологий оказывается простой. * С точки зрения индивидуальных программных проектов, API, которые были разработаны, чтобы позволить программному обеспечению работать с Pylons, также подразумевают то, что программное обеспечение намного легче интегрировать в другие фреймворки, поскольку требуемые API уже существуют. * Оттого, что многие из компонентов не были изначально спроектированы именно для использования в Pylons, это также означает, что гораздо более вероятно, что Вы сможете использовать их способами, которые обычно не предполагают в отношении компонентов веб-фреймворка. Например, !FormEncode также отличная библиотека конверсии общего назначения, а SQLAlchemy используется во многих проектах, совершенно не связанных с вебом. Это означает, что по мере роста Ваших приложений или при смене требований, у Pylons гораздо больше шансов идти в ногу. Одна из проблем для начинающих в Pylons заключается в том, что может оказаться трудным узнать, как сочетаются вместе все компоненты, особенно потому что документация индивидуальных проектов не обязательно веб-фокусирована. Вот где пригодится эта книга. == Что предстоит == В течение следующей 21 главы Вы узнаете все, что необходимо знать для создания простого веб-сайта с навигационной иерархией, редактируемыми разделами и страницами, поддержкой комментариев и тэгов. Приложение будет служить очень хорошей отправной точкой для любого основанного на Pylons веб-сайта, который Вы создаете. Книга разделена на три части: уровень для начинающих, Pylons для продвинутых пользователей и Pylons для экспертов. В части "Уровень для начинающих" Вы узнаете: * как установить Pylons на Linux, Mac или Windows так, чтобы не мешать другому программному обеспечению в Вашей системе * как использовать шаблоны для создания настраиваемых образцов проекта, что позволит подготовить и быстро запустить, используя функцию Вставить скрипт * основы HTTP-протокола и как объекты запроса и ответа Pylons облегчают работу по протоколу * основы Pylons архитектуры, и для чего предназначен каждый из глобальных параметров Pylons * как использовать лидирующий в индустрии интерактивный отладчик Pylons, а также инструменты отчетности электронной почты * как создавать шаблоны для Вашего уровня представлений при помощи Mako, а также как пользоваться преимуществами таких возможностей, как наследование, для применения согласующихся тем на большом количестве страниц, и как использовать компоненты для генерации простых структур, таких как элементы навигации * как создавать формы, используя помощники Pylons, и как проверять и повторно заполнять их по мере необходимости, используя !FormEncode и HTMLFill. * как обращаться с закачками файлов и структурами повторяющейся проверки на правильность, включая преобразование один-во-много в Вашей модели * различные программные возможности для Вашей модели, будь то XML база данных, Amazon S3 или SimpleDB хранилище или традиционная система управления реляционными базами данных * как можно использовать SQLAlchemy для моделирования Вашей базы данных, экономя время и силы Мы также начнем с нашего образца - приложения, носящего название !SimpleSite, так что Вы посмотрите на то, как методы, с которыми Вы ознакомились, работают в реальном приложении. После того, как Вы освоите основы, мы рассмотрим некоторые из более продвинутых возможностей и методов, которые могут быть использованы в приложениях Pylons. Они включают в себя следующую информацию: * как использовать маршруты, чтобы разрешить сложные преобразования между URL-адресами, которыми манипулирует Ваше приложение, и кодом, который управляет ими, а также передовой опыт в области проектирования URL и как URL-адреса могут использоваться в качестве хранилищ простого режима * что такое Юникод и как его использовать во всем Вашем приложении Pylons * как писать приложение Pylons, которое поддерживает большое количество языков и показывает незападные символы, такие как японские или арабские * библиотека YUI и как она может использоваться для упрощения CSS и схем на клиентской стороне * основы языка !JavaScript, включая области его отличия от Python * как использовать AJAX, анимацию и перетаскивание для совершенствования Ваших веб-приложений * как написать полезный модуль и функциональные тесты * как использовать docstrings и reStructuredText для быстрого и легкого написания хорошей документации для Вашего Pylons проекта. Затем мы вернемся к примеру !SimpleSite и добавим навигационную иерархию, CSS и !JavaScript к приложению-образцу, а также продемонстрируем некоторые продвинутые возможности SQLAlchemy, такие как наследование. После того, как Вы освоите эти методы, Вы узнаете все о внутренней структуре Pylons и как можно с легкостью использовать спецификацию, называемую шлюзовым интерфейсом веб-сервера для расширения или изменения способы работы самого Pylons. Мы охватим следующие темы: * спецификацию шлюзового интерфейса веб-сервера и детали программирования различных типов компонентов шлюзового интерфейса веб-сервера * немного об истории Pylons и как она влияет на методологию проектирования * как Pylons использует развернутую вставку и зачаточные точки входа для обеспечения легкости настройки программного обеспечения средней сложности и приложений в конфигурационных файлах * как Pylons использует зачаточный формат и инструменты по настройке для облегчения создания пакетов программ и распространения Pylons приложений и зависимостей от каталога программных пакетов Python * как вставка скрипта может использоваться с файлом websetup.py для предоставления пользователям быстрой настройки Вашего приложения * как использовать !AuthKit для осуществления аутентификации и авторизации, соответствующих потребностям Вашего приложения принципы различных способов написания веб-приложений, включая многопоточные, многопроцессные и асинхронные приложения, и почему большинство возможностей развертывания для Pylons являются многопоточным * как развертывать приложение Pylons, используя Apache или Nginx прокси на сервер вставки. Как использовать mod_wsgi для встраивания приложений Pylons в Apache сервер. Где можно узнать о многих других способах развертывания приложений Pylons. * как использовать мощную систему регистрации Python в Pylons приложении Затем мы в последний раз взглянем на приложение !SimpleSite и узнаем, как превратить проект обратно в шаблон так, чтобы другие люди могли его использовать в качестве отправной точки для своих собственных приложений. К концу книги у Вас должно быть глубокое понимание того, как использовать Pylons, но мы надеемся, что Вы также получите хорошие знания технологий, используемых Pylons, и основных аргументов их включения во фреймворк, так что у Вас будет возможность сделать собственный выбор в отношении того, какие компоненты использовать в Вашем Pylons приложении. Pylons - это фреймворк, который спроектирован для работы с Вами, а не для навязывания своего представления о мире в Вашем проекте. Эта книга даст Вам навыки, требующиеся для использования стандартных возможностей Pylons, и также позволяющие Вам знать, когда можно нарушить правила. == Резюме == Эта глава дала Вам широкое понимание некоторых философий проектирования Pylons и того, что делает его немного отличным от других фреймворков, с которыми Вы, возможно, сталкивались. Очевидно, что материала для изучения много, поэтому давайте приступим!