Chapter 1: Введение

Введение

web2py[web2py] это бесплатный, open-source веб-фреймворк, позволяющий быстро разрабатывать безопасные веб приложения, основанные на базе данных; он написан на языке Python[python] и программируется в Python. web2py это full-stack полнофункциональный Фреймворк, это означает, что он содержит все необходимые компоненты для создания полнофункциональных веб приложений.

Web2py спроектирован так, что бы дать веб-разработчику возможность следовать хорошей практике разработки программного обеспечения, такой как использование шаблона проектирования "Модель-Представление-Контроллер" (MVC - Model-View-Controller). web2py отделяет предоставление данных (Модель) от представления данных (Представление), а также от логики приложения и рабочего процесса (Контроллер). web2py предоставляет библиотеки в помощь разработчику дизайна, оснастки, и тестирует каждую из этих трех частей по отдельности, и заставляет их работать вместе.

web2py построен с учетом обеспечения безопасности. Это означает, что он автоматически решает многие из тех вопросов, которые могут привести к появлению уязвимостей в системе безопасности, следуя хорошо установившейся практики. Например, он проверяет все входные данные (для предупреждения инъекций), пресекает утечки всех выходных данных (для предупреждения межсайтового скриптинга), переименовывает загруженные файлы (для предупреждения атак обхода каталогов directory traversal attacks). web2py заботится об основных вопросах безопасности, таким образом у разработчиков имеется меньше шансов внесения уязвимостей.

web2py включает в себя Абстрактный Уровень Базы Данных (DAL), который пишет SQL[sql-w] запросы динамически, так что вам, разработчикам, не придется думать об этом. Уровень DAL знает как прозрачно генерировать SQL-запросы для SQLite[sqlite], MySQL[mysql], PostgreSQL[postgres], MSSQL[mssql], FireBird[firebird], Oracle[oracle], IBM DB2[db2], Informix[informix] и Ingres[ingresdb].

Уровень DAL может также генерировать вызовы функций для Google Datastore, когда запускается на Google App Engine (GAE)[gae]. Экспериментально мы поддерживаем большинство баз данных и новые постоянно добавляются. Пожалуйста, проверьте веб-сайте web2py и список рассылки для более свежих адаптеров. После того, как один или несколько таблиц базы данных определены, web2py автоматически генерирует полнофункциональный веб-интерфейс администратора базы данных для доступа к базе данных и таблицам.

web2py отличается от других фреймворков в том, что он является единственным Фреймворком, полностью охватывающим парадигму Web 2.0, когда веб является компьютером. По факту, web2py не требует установки или настройки; он работает на любой архитектуре, на которой может запускаться Python (Windows, Windows CE, Mac OS X, iOS, и Unix/Linux), разработка, развертывание и фазы технического обслуживания для приложений могут быть выполнены с помощью локального или удаленного веб-интерфейса. web2py работает с CPython (реализация на языке C) и PyPy (Python написанный в Python), на версии Python 2.7.

web2py имеет систему контроля ошибок (ticketing system). Если произошла ошибка,она выдается пользователю и сохраняется для администратора.

web2py это программный продукт с открытым исходным кодом, выпущенный под лицензией LGPL версии 3.

Еще одной особенностью web2py является то, что его разработчики обещают сохранять обратную совместимость будущих версий web2py с существующими приложениями. Это делается начиная с первого выпуска web2py в октябре 2007 года. За последнее время в web2py были добавлены новые функции и исправлены ошибки, но если Ваше приложение работало с web2py версии 1.0, то оно будет работать и с текущей версией.

Вот некоторые заявленные web2py примеры, которые иллюстрируют свою мощь и простоту. В следующем коде:

db.define_table('person', Field('name'), Field('image', 'upload'))

создается таблица базы данных под названием "person" с двумя полями: "name", строкового типа и "image", со ссылкой на файл, который должен загружаться на сервер (реальное изображение). Если таблица уже существует, но не соответствует этому определению, то она будет приведена в соответствие с заданным определением таблицы.

Для определенной выше таблицы, следующий код:

form = SQLFORM(db.person).process()

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

Этот код встраивает полностью рабочий вики с тегами, поиском, облаком тегов, правами доступа, медиа-вложениями, а также с поддержкой формата oembed:

def index(): return auth.wiki()

Следующий код взамен предыдущего:

@auth.requires_permission('read','person')
def f(): ....

предотвращает доступ к функции f тем пользователям, группа которых не имеет права на чтение "read" записей в таблице "person". Если пользователь не выполнил вход, то он будет перенаправлен на страницу входа (эти страницы и функции авторизации уже включены в состав web2py).

web2py также поддерживает компоненты, то есть действия, которые могут быть загружены в представление и взаимодействовать с посетителем через Ajax без перезагрузки всей страницы. Это делается с помощью LOAD помощника, который позволяет использовать модульный дизайн приложений; это обсуждается в главе 3 в контексте вики и, несколько детальнее, в последней главе этой книги.

Это 6-е издание книги описывает web2py 2.4.1 и более поздние версии.

Основные принципы

При программировании на языке Python обычно следуют этим основным принципам:

  • Не повторять себя Don't repeat yourself (DRY).
  • Должен быть только один способ сделать это.
  • Явное лучше, чем подразумеваемое.

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

request

Web2py отличается от других Фреймворков отношением к третьему принципу, который иногда вступает в противоречия с двумя другими. В частности, web2py не импортирует пользовательские приложения, но выполняет их в заранее определенном контексте. Этот контекст подвергает к действию ключевые слова Python, а также ключевые слова web2py.

Для некоторых это может показаться, как магия, но это не так. Проще говоря, на практике, некоторые модули уже импортированы без вашего ведома. Web2py пытается избежать надоедливых характеристик других Фреймворков, которые заставляют разработчика импортировать одни и те же модули в верхней части текста каждой модели или контроллера.

Web2py, автоматически импортируя свои модули, экономит время и предотвращает ошибки, и таким образом, следует принципу "не повторять себя", нарушая принцип "должен быть только один способ сделать это".

Если разработчик желает использовать другие модули Python и модули сторонних разработчиков, эти модули должны быть импортированы в явном виде, как и в любой другой программе Python.

Веб фреймворки

PHP
ASP
JSP

На самом фундаментальном уровне, веб-приложение состоит из множества программ (или функций), которые выполняются, когда пользователь посещает сайт - заданный URL. Результаты работы данных функций возвращаются пользователю и визуализируется в его веб-браузере.

Задача веб-фреймворков это позволить разработчикам построить новое приложение быстро, легко и без ошибок. Это достигается путем предоставления API и инструментов, которые позволяют сократить и упростить объем требуемого кода.

Два классических подхода к разработке веб-приложений:

  • Генерация HTML[html-w] [html-o] программно.
  • Внедрение кода в HTML страницы.

Первый подход использовался, например, в ранних CGI-сценариях. Второй подход применяется, например в PHP[php] (где код в PHP - C-подобный язык), ASP (где код - Visual Basic) и JSP (где код - Java).

Здесь мы приведем пример PHP-программы, которая извлекает данные из базы данных и возвращает HTML-страницу с выбранной записью:

<html><body><h1>Records</h1><?
  mysql_connect(localhost,username,password);
  @mysql_select_db(database) or die( "Unable to select database");
  $query="SELECT * FROM contacts";
  $result=mysql_query($query);
  mysql_close();
  $i=0;
  while ($i < mysql_numrows($result)) {
    $name=mysql_result($result,$i,"name");
    $phone=mysql_result($result,$i,"phone");
    echo "<b>$name</b><br>Phone:$phone<br /><br /><hr /><br />";
    $i++;
  }
?></body></html>

Проблема такого подхода заключается в том, что PHP-код встраивается в HTML, но в PHP-коде надо генерировать дополнительный HTML-код и SQL-запросы для доступа к базе данных, получается несколько уровней кода, который трудно понимать и поддерживать. Ситуация ухудшается для ajax-приложений, а также с ростом числа HTML-страниц(файлов), из которых состоит приложение.

Функциональность приведенного выше примера на PHP может быть реализована в web2py двумя строками кода Python:

def index():
    return HTML(BODY(H1('Records'), db().select(db.contacts.ALL)))

В этом простом примере, структура HTML-страницы представлена программно с помощью HTML, BODY, и H1 объектов; база данных db опрашивается командой select; в конечном итоге полученные данные сериализуется в HTML. Обратите внимание db это не ключевое слово, это определенная пользователем переменная. Мы будем использовать это имя, чтобы постоянно ссылаться на соединение с базой данных во избежание путаницы.

Веб фреймворки, как правило, классифицируются как один из двух типов:

  • "склеенные" (glued) - созданные из нескольких компонентов, обычно сторонней разработки
  • "полнофункциональные" (full-stack) - специально спроектированные и разработанные для совместной работы и тесно интегрированные в систему.

Web2py это полнофункциональный Фреймворк. Почти все его компоненты созданы "с нуля" и предназначены для совместной работы, но они работают так же хорошо и вне web2py. Например, абстрактный уровень данных (DAL) или язык шаблонов могут использоваться независимо от web2py путем импорта их модулей: - gluon.dal или gluon.template в Ваше приложение на языке Python. gluon это имя web2py-папки, которая содержит файлы системных библиотек. Некоторые web2py-библиотеки, предназначенные для создание и обработки форм, опирающихся на таблицы из БД, зависят от других частей web2py. Web2py также может работать со сторонними библиотеки Python, включая другие языки шаблонов и ORM, но они не будут столь, же плотно интегрированы в оригинальные компоненты.

Модель-Представление-Контроллер

Model-View-Controller

web2py силами разработчиков разделен на три отдельные части: предоставление данных (Модель), представление данных (Представление) и рабочий процесс приложения (Контроллер). Давайте снова рассмотрим предыдущий пример и посмотрим, как построить приложение web2py вокруг него. Ниже приведен пример web2py MVC интерфейс редактирования:

image

Типичный рабочий процесс прохождения запроса в web2py описывается на следующей диаграмме:

image

На диаграмме:

  • Сервер может быть встроенным web2py веб-сервером или сторонним сервером, таким как Apache. Сервер является многопоточным.
  • "main" - это главное WSGI-приложение web2py. Оно выполняет все общие задачи и является обёрткой пользовательских приложений. В нем обрабатываются куки, сессии, транзакции, прямое и обратное отображения URL, диспетчеризация (анализ URL для определения того, какую функцию контроллера надо вызвать). Оно может обслуживать и поток статических файлов, если веб-сервер ещё не сделал этого сам.
  • Мodels, Views и Controller являются компонентами пользовательского приложения.
  • Один экземпляр web2py может поддерживать несколько пользовательских приложений.
  • Пунктирные стрелки представляют связи с одной или несколькими базами данных. Запросы к БД могут быть определены как на языке SQL (не рекомендуется), так и с помощью DAL (рекомендуется), так что web2py приложение не зависит от конкретной СУБД.
  • Диспетчер перенаправляет запрошенный URL-адрес для вызова функции в контроллере. Результат функции может быть строкой или словарем символов (хэш-таблицы). Данные в словаре отображаются посредством шаблона View. Если посетитель запрашивает HTML страницу (по умолчанию), то словарь отображает данные на HTML странице. Если посетитель просит ту же страницу в XML, web2py пытается найти шаблон View, который может встроить словарь в XML. Разработчик может создать шаблон View, который сможет встроить в страницу возвращаемые функцией контроллера данные в любом из поддерживаемых протоколов (HTML, XML, JSON, RSS, CSV, и RTF) или в дополнительных пользовательских протоколов.
  • Все запросы обернуты в транзакции и любое не перехваченное исключение вызовет откат этой транзакции. Если запрос обработан успешно, то транзакция завершается нормально.
  • web2py также обрабатывает сессий и куки сессии автоматически, а когда транзакция выполнена, то сессия также сохраняется, если не указано иное.
  • Можно зарегистрировать выполнение периодических задач (через cron), запускаемых в запланированное время или после завершения определенных действий. Таким образом, можно запускать долго выполняющиеся и ресурсоёмкие задачи в фоновом режиме без замедления навигации по сайту.

Минимальное и полное MVC-приложение содержит три файла:

файл "db.py" - это файл Модели: Подключение web2py приложения к базе данных задается очень просто, следующим образом:

db = DAL('sqlite://storage.sqlite')
db.define_table('contact',
   Field('name'),
   Field('phone'))

Приложение подключается к базе данных (в данном примере SQLite база данных хранится в файле storage.sqlite) и определяет таблицу под названием contact. Если таблица не существует, то web2py создает ее и, прозрачно и в фоновом режиме, генерирует SQL код на соответствующем SQL диалекте для используемого конкретного движка базы данных. При желании разработчик может увидеть сгенерированный SQL код, но данный код нет необходимости менять если возникнет необходимость Back-end базу данных, в качестве которой по умолчанию применяется SQLite, в дальнейшем заменить на MySQL, PostgreSQL, MSSQL, FireBird, Oracle, DB2, Informix, Interbase, Ingres и Google App Engine (оба SQL и NoSQL).

Обратите внимание на то, что в усовершенствованной версии web2py конкретное соединение с базой данных добавляется в текстовом файле конфигурации appconfig.ini, который находится в директории private папки приложения. Это облегчает развертывание приложения из среды разработки на рабочем сервере, потому что подключение к базе данных скорее всего отличается. Таким образом, вместо того, чтобы написать:

db = DAL('sqlite://storage.sqlite')

Вы увидите код, подобный этому:

## app configuration made easy. Look inside private/appconfig.ini
from gluon.contrib.appconfig import AppConfig
## once in production, remove reload=True to gain full speed
myconf = AppConfig(reload=True)
...
db = DAL(myconf.take('db.uri'), pool_size=myconf.take('db.pool_size', cast=int), check_reserved=['all'])

Если вы посмотрите в текстовый файл конфигурации private/appconfig.ini, то вы по-прежнему увидите, что база данных по умолчанию SQLite.

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

файл "default.py" - это файл Контроллера:

def contacts():
    grid=SQLFORM.grid(db.contact, user_signature=False)
    return locals()

В web2py, URL-адреса сопоставляются с соответствующими модулями Python и вызываемыми функциями. В данном случае, контроллер содержит одну функцию (или "действие") с именем contacts. Действие может возвращать строку (возвращает веб-страницу) или Python словарь (набор пар типа key:value) или набор локальных переменных (как в данном примере). Если функция возвращает словарь, он передается в шаблон Представления с тем же именем, что и функция контролера controller/function, который в свою очередь визуализирует страницу. В данном примере, функция contacts генерирует форму таблицы (grid), которая может выполнять операции select/search/create/update/delete, для таблицы базы данных db.contact и возвращает форму таблицы в шаблон Представления.

файл "default/contacts.html" это файл Представления:

{{extend 'layout.html'}}
<h1>Manage My Contacts</h1>
{{=grid}}

Этот шаблон Представления автоматически вызывается web2py после того, как соответствующая функция (действие) контроллера выполняется. Целью шаблона Представления является визуализация в HTML-код переменных в возвращенном словаре (в данном случае формы grid). Файл шаблона Представления написан на языке гипертекстовой разметки HTML, но включает в себя также и Python код, который находится между специальными парными скобками {{ и }}. Это значительно отличается от примера PHP кода, потому что внедренный в HTML Python-код является кодом "уровня представления". Файл "layout.html", на который делается ссылка в верхней части шаблона Представления предоставляется web2py и представляет собой основной макет для всех приложений web2py. Файл макета может быть легко изменен или заменен.

Почему следует выбирать web2py

Web2py является одним из многих веб-фреймворков, но он имеет убедительные и уникальные свойства. Web2py первоначально был разработан в качестве учебного пособия, со следующими главными мотивациями:

  • Легкость для пользователей в изучении веб-разработки на стороне сервера без ущерба для функциональности. По этой причине, web2py не требует установки и не требует настройки, не имеет зависимостей (за исключением случая распространения web2py в виде исходного кода, который требует Python 2.7 и его стандартные библиотеки модулей), и предоставляет большую часть своей функциональности через веб-интерфейс, включая интегрированную среду разработки с отладчиком и интерфейс базы данных.
  • Web2py был стабильным с самого первого дня, поскольку его разработка происходила "сверху-вниз"; т.е. его API был разработан до момента его реализации. Даже когда была добавлена новая функциональность, web2py никогда не нарушал принцип обратной совместимости, и он не будет нарушать совместимость, когда дополнительная функциональность будет добавлена в будущем.
  • В web2py активно решаются наиболее важные вопросы безопасности, которые затрудняют работу многих современных веб-приложений, как это определено ниже проектом OWASP[owasp].
  • web2py имеет легкий вес. Его основные библиотеки, в том числе Абстрактный Уровень Базы данных, язык шаблонов и все HTML-помощники занимают не более 1.4 Мб. Весь исходный код, включая примеры приложений, занимает не более 10.4MB.
  • web2py занимает небольшую площадь и очень быстрый. Он использует WSGI-совместимый веб-сервер Rocket [rocket] разработанный Timothy Farrell. Он быстрей Apache при использовании mod_wsgi, поддерживает SSL и IPv6.
  • web2py использует синтаксис языка Python для моделей, контроллеров, и файлов представления, но обратите внимание web2py не импортирует модели и контроллеры (как другие python-фреймворки), а выполняет их. это означает что приложения могут быть установлены, удалены, модифицированы без рестарта веб-сервера (даже на рабочем сервере), и различные приложения могут сосуществовать вместе без взаимных наложений друг на друга.
  • web2py использует Абстрактный Уровень Базы данных (DAL) взамен Объектно-Реляционного Отображения (ORM). С концептуальной точки зрения, это означает, что различные таблицы базы данных отображаются в различных экземплярах одного Table класса а не в разных классах,в то время как записи отображаются в экземплярах одного Row класса, а не в экземплярах соответствующего класса таблицы. С практической точки зрения, это означает, что SQL-синтаксис отображается практически один к одному в DAL-синтаксисе, без сложных метаклассов программирования собираемых под капотом, как в популярных ORMs, которые добавили бы время ожидания.

Интерфейс шлюза веб-сервера WSGI [wsgi-w] [wsgi-o] (Web Server Gateway Interface) является новым стандартом Python для обмена данными между веб-сервером и приложениями на языке Python.

Вот скриншот главного интерфейса администратора web2py:

image

Безопасность

security

Проект обеспечения безопасности открытых веб-приложений (Open Web Application Security Project - OWASP) [owasp] является свободным и открытым международным сообществом и направлен на улучшение безопасности прикладного программного обеспечения в сети Интернет.

OWASP перечислил десять важнейших проблем безопасности, которые стоят перед веб-приложениями. Этот список приводится здесь, наряду с описанием того, как каждая из проблем решается с помощью web2py:

  • cross site scripting
    "Cross Site Scripting (XSS): XSS проблема возникают всякий раз, когда web-приложение принимает пользовательские данные без их первичной проверки или декодирования их содержимого. XSS позволяет злоумышленнику запускать скрипты в браузере жертвы, которые могут захватить пользовательские сессии, искажать веб-сайты, возможно, заразить червями и т.п." Web2py, по умолчанию, экранирует переменные, подставляемые в шаблон, предотвращая тем самым атаки типа XSS.
  • injection flaws
    "Injection Flaws: Инъекция вредного кода, в частности, SQL-инъекции, являются общими в веб-приложениях. Инъекции происходит, когда данные пользователя отправляются на сервер в составе команды или запроса. Злоумышленник встраивает свой код в эти команды и запросы, приводя к выполнению ненужных команд или изменению данных." Web2py включает в себя DAL, что делает SQL-инъекции невозможными. Как правило, SQL-инъекции создаёт не разработчик. SQL-запросы генерируется динамически с помощью DAL, избегая вставки в SQL-запросы злонамеренных данных.
  • malicious file execution
    "Malicious File Execution: Исполнение вредоносных файлов. Когда код уязвим для удаленного включения в него вредоносного файла (Remote File Inclusion - RFI), это позволяет злоумышленникам включать вредоносный код и данные, результатом этого разрушительного нападения обычно бывает полная компрометация сервера." Web2py разрешает пользователю видеть имена только тех функций, которые должны вызываться, предотвращая включение в их код вредоносных исполняемых файлов. Имена импортируемых функций или функций, принимающих аргументы, нигде и никогда не показываются. Показываются только интернет функции контроллера, которые не принимают аргументов. Административный web-интерфейс web2py позволяет легко отслеживать, какие интернет функции контроллера показываются пользователю, а какие - нет.
  • insecure object reference
    " Insecure Direct Object Reference: Небезопасные прямые ссылки на объекты создаются, когда разработчик использует ссылку на объект внутренней реализации, такой как: файл, каталог, базу данных, ключ, URL или параметр формы. Злоумышленники могут манипулировать этими ссылками для доступа к этим или другим объектам без прохождения процедуры идентификации." Web2py не раскрывает никаких своих внутренних объектов, кроме того, web2py проверяет все URL-адреса, предотвращая таким образом атаки, связанные с обходом каталогов. web2py также предоставляет механизмы для создания форм, автоматически проверяя все значения, вводимые пользователем.
  • CSRF
    "Cross Site Request Forgery (CSRF) - Межсайтовая подделка запроса: Атака CSRF вынуждает браузер вошедшей в систему жертвы отправить предварительно аутентифицированный запрос на уязвимое веб-приложение, который затем вынуждает браузер жертвы выполнять враждебные действия в пользу злоумышленника. CSRF может быть столь же мощным, как веб-приложение, что он атакует." web2py предотвращает CSRF, а также случайную двойную отправку формы на сервер путем присвоения одноразового случайного маркер каждой форме. Кроме того web2py использует UUID для куки сессии.
  • information leakage
    improper error handling
    "Утечка информации и неправильная обработка ошибок(Information Leakage and Improper Error Handling): Приложения могут допускать непреднамеренную утечку информации об их конфигурации, внутренней работе, или нарушать неприкосновенность частной жизни пользователей из-за различных проблем приложения. Злоумышленники пользуются этим для кражи конфиденциальных данных или для более серьезных атак." Web2py включает ticketing system - систему управления ошибками. Сообщение об ошибке не выводится пользователю. Все ошибки регистрируются в талонах, а талоны соответствует пользователям, что позволяет администратору позже отслеживать ошибки. Ошибка, также как и исходный код модуля в котором она возникла, доступны только администратору.
  • "Разрушение процедур идентификации или управления сессиями (Broken Authentication and Session Management): Учет полномочий пользователей и идентификаторы сессий часто защищены не надлежащим образом. Злоумышленники компрометируют пароли, ключи или идентификаторы сессии предполагая, что они идентичны у всех пользователей" web2py обеспечивает встроенный механизм идентификации для администратора, когда он управляет сессиями независимо для каждого приложения. Административный интерфейс обеспечивает безопасность куки сессии, когда клиент пришел не с "localhost". Для приложений, он включает в себя мощный API управления доступом пользователей на основе ролей (Role Based Access Control - RBAC).
  • cryptographic store
    "Ненадежное шифрование при хранении данных (Insecure Cryptographic Storage): Веб-приложения редко используют криптографические функции надлежащим образом, чтобы защитить данные и полномочия пользователей. Злоумышленники используют слабо защищенные данные для осуществления краж идентификационной информации и других преступлений, таких как мошенничество с кредитными картами." web2py при хранении паролей использует алгоритмы шифрования MD5 или HMAC + SHA-512. Другие алгоритмы также доступны.
  • secure communications
    "Небезопасная связь (Insecure Communications): Приложения часто не используют шифрование сетевого трафика, когда это необходимо для защиты конфиденциальных данных." web2py включает Rocket WSGI-сервер с возможностью шифрования соединений по протоколу SSL [ssl], но он может также использовать Apache или Lighttpd с mod_ssl обеспечивая SSL-шифрование соединений.
  • access restriction
    "Неспособность ограничить доступ по URL (Failure to Restrict URL Access): Часто приложение защищает только чувствительные функции, предотвращая срабатывание ссылок или доступ по URL для неавторизованных пользователей. Злоумышленники могут использовать эту слабость для выполнения несанкционированных операций с помощью прямого доступа по URL." web2py отображает URL-запросы на Python-модули и функции контроллера. web2py имеет механизм для объявления некоторых функций публичными, что требует от пользователя, вызвавшего их, прохождения процедуры авторизации и проверки подлинности. Встроенный API управления доступом пользователей на основе ролей позволяет разработчикам ограничивать доступ к любой функции контроллера с помощью авторизации входа, членства в группе и прав, предоставленных членам группы, основанных на разрешениях. Разрешения достаточно сильно измельчены (гранулированы) и могут быть могут быть объединены с фильтрами базы данных, позволяя, например, предоставлять доступ к конкретным таблицам и/или записям. web2py также допускает цифровую подпись URL и обеспечивает API для создания цифровой подписи обратных вызовов Ajax.

web2py был пересмотрен на предмет безопасности, и вы можете найти результаты обзора по ссылке.[pythonsecurity].

В коробке

Вы можете скачать web2py с официального веб-сайта:

http://www.web2py.com

Web2py состоит из следующих компонентов:

  • libraries (библиотеки): обеспечивают базовую функциональность web2py и доступны программно.
  • web server: веб сервер Rocket WSGI сервер.
  • Приложение admin : Это приложение используется для создания, проектирования и управления web2py-приложениями. admin обеспечивает интегрированную веб-ориентированную среду разработки (IDE) для создания web2py-приложений. admin включает и другие функциональные возможности, такие как веб-ориентированное тестирование, а также веб-ориентированную оболочку.
  • Приложение examples : содержит документацию и интерактивные примеры. examples - это клон официального web2py сайта, который включает в себя документацию web2py, изготовленную с помощью пакета Epydoc.
  • Приложение welcome : Базовый шаблон для любого другого приложения. По умолчанию в него включено CSS каскадное меню и аутентификация пользователей (более подробно об этом в Главе 9)

web2py распространяется в исходных и исполняемых кодах для Microsoft Windows и Mac OS X.

web2py в исходном коде может быть использован на любой платформе, на которой запускается Python и включает в себя вышеупомянутые компоненты. Для запуска исходного кода, вы должны иметь предварительно установленный Python 2.7 в системе. Кроме того, должен быть установлен один из поддерживаемых движков базы данных. Для тестирования небольших приложений, вы можете использовать СУБД SQLite, включенную в состав дистрибутива Python 2.7.

Исполняемые коды web2py (для Windows и Mac OS X) включают в себя интерпретатор Python 2.7 и СУБД SQLite. Технически, эти два объекта не являются компонентами web2py. Включение их в двоичный дистрибутив позволяет запускать web2py прямо "из коробки".

На следующем рисунке показана общая структура web2py:

image

В нижней части мы найдем Python интерпретатор. Переместившись вверх мы обнаруживаем веб-сервер (rocket), библиотеки, и приложения. Каждое приложение содержит собственную конструкцию MVC (модели, контроллеры, представления, модули, языки, базы данных, и статические файлы). Каждое приложение включает в себя свой собственный код администратора базы данных (appadmin). Каждый web2py экземпляр поставляется с тремя приложениями: welcome (скафолдинговое приложение), admin (веб-оболочка IDE), и examples (копия оффициального сайта и примеры).

Об этой книге

Эта книга включает в себя следующие главы, помимо данного введения:

  • Глава 2 минимальное введение в язык Python. Оно предполагает ознакомление с двумя процедурными и объектно-ориентированными концепциями программирования, таких как циклы, условия, вызовы функций и классы, и охватывает основной синтаксис Python. В нем также рассматриваются примеры модулей Python, которые используются на протяжении всей книги. Если вы уже знаете Python, то вы можете пропустить Главу 2.
  • Глава 3 показывает, как запустить web2py, обсуждается административный интерфейс, и направляет читателя через различные примеры с постепенной возрастающим уровнем сложности: приложение, которое возвращает строку, счетчик приложений, блог изображений, а также полномасштабное вики-приложение, которое позволяет загружать изображения и комментарии, обеспечивает аутентификацию, авторизацию, веб-сервисы и RSS-канал. Читая эту главу, вам возможно, потребуется обратиться к Главе 2 для ознакомления с общим синтаксисом Python и к последующим главам для получения более подробной информации об используемых функциях.
  • Глава 4 охватывает более систематизировано основную структуру и библиотеки: URL-отображение, запрос, ответ, сессии, кэширование, планировщик, Cron, интернационализацию и общий рабочий процесс.
  • Глава 5 представляет собой ссылку для языка шаблонов, используемого при создании представления. Он показывает как встроить код Python в HTML, и демонстрирует использование помощников (Объекты которые генерируют HTML).
  • Глава 6 охватывает Абстрактный Уровень Базы данных, или DAL. Синтаксис DAL представлен через ряд примеров.
  • Глава 7 охватывает формы, валидацию форм и обработку форм. FORM является помощником низкого уровня при построении форм. SQLFORM является высокоуровневым конструктором форм. В Главе 7 мы также обсудим API для создания/чтения/обновления/удаления - Create/Read/Update/Delete (CRUD) API.
  • Глава 8 охватывает коммуникационные возможности, для получения и отправки электронной почты и SMS.
  • Глава 9 охватывает аутентификацию, авторизацию и расширяемый механизм контроля доступа на основе ролей, доступные в web2py. Конфигурация почты и CAPTCHA, также обсуждаются здесь, так как они используются для проверки подлинности. В третьем издании книги мы добавили широкое освещение интеграции с механизмами аутентификации сторонних производителей, таких как OpenID, OAuth, Google, Facebook, LinkedIn, и т.д..
  • Глава 10 идет речь о создании веб-сервисов в web2py. Мы приводим примеры интеграции с Google Web Toolkit через Pyjamas и с Adobe Flash через PyAMF.
  • Глава 11 о web2py и Jquery рецептах. web2py предназначен главным образом для программирования на стороне сервера, но он включает в себя jQuery, поскольку мы обнаружили, что это будет лучшей JavaScript библиотекой с открытым исходным кодом доступной для эффектов и Ajax. В этой главе мы рассмотрим, как эффективно использовать JQuery с web2py.
  • Глава 12 обсуждаются компоненты web2py и плагины в качестве способа создания модульных приложений. Мы предлагаем пример плагина, который реализует многие часто используемые функции, такие как построения графиков, комментарии и пометки.
  • Глава 13 о развертывании рабочих web2py приложений. В частности, мы обсудим развертывание на веб-сервере LAMP (который мы считаем основной альтернативой развертыванию). Мы обсудим альтернативные веб-серверы, и конфигурацию базы данных PostgreSQL. Мы обсудим возможность запуска в качестве сервиса в среде Microsoft Windows, и развертывание на некоторых специфичных платформах, включая Google Applications Engine, Heroku, и PythonAnywhere. В этой главе мы также обсудим вопросы безопасности и масштабируемости.
  • Глава 14 содержит множество других рецептов для решения конкретных задач, в том числе модернизации, геокодирования, постраничного вывода, API Twitter и многое другое.
  • Глава 15 содержит информацию о том, как помочь и внести свой вклад в проект, включая такие темы, как сообщить о найденных ошибках и внести изменения в код.

Эта книга охватывает только основные функциональные возможности web2py и API, который поставляется с web2py. Эта книга не охватывает web2py оснастку (т.е. готовые приложения).

Вы можете скачать web2py оснастку с соответствующего веб-сайта [appliances].

Вы можете найти дополнительные темы, обсуждаемые группой пользователей [usergroup]. Существует также AlterEgo[alterego], старый web2py блог и FAQ.

MARKMIN

Эта книга была написана с использованием MARKMIN синтаксиса смотрите Глава 5 и автоматически преобразуются в HTML, LaTeX и PDF.

Поддержка

Основным каналом поддержки является группа пользователей [usergroup], с десятками сообщений каждый день. Даже если вы новичок, то не стесняйтесь обращаться к нам - мы будем рады помочь Вам. Существует также формальная система отслеживания проблем на https://github.com/web2py/web2py/issues . И последнее, но не менее важное, вы можете иметь профессиональную поддержку (см веб-сайт для более подробной информации).

Содействие

Любая помощь очень ценится. Вы можете помочь другим пользователям в группе пользователей, или путем непосредственного представления патчей к программе (на сайте GitHub https://github.com/web2py/web2py). Даже если вы нашли опечатку в этой книге, или имеете улучшение для нее, то лучшим способом помочь является латание самой книги (которая находится в папке исходного репозитория по адресу https://github.com/mdipierro/web2py-book). Для получения дополнительной информации по содействию, смотрите Глава 15

Элементы стиля

PEP8 [style] содержит хорошую практику стиля оформления программ на языке Python. Вы увидите, что web2py не всегда соблюдает эти правила. Но это происходит не из-за бездействия или халатности. Мы считаем, что пользователи web2py должны следовать этим правилам, и мы призываем их к этому. Мы решили не соблюдать некоторые из этих правил при определении вспомогательных объектов web2py, с тем чтобы свести к минимуму вероятность конфликтов имен объектов, определенных в web2py, с объектами, определенными пользователем.

Например, класс, который представляет тег <div> называется DIV, в то время как в соответствии с PEP-08 его правильнее было бы называть Div. Мы считаем, что для этого конкретного примера, использование имени DIV является более естественным выбором. Кроме того, этот подход оставляет программистам возможность создания класса под именем "Div", если они захотят это сделать. Наш синтаксис также используется в обозначении DOM, как и в большинстве браузеров (например, в Firefox).

В соответствии с руководством по стилю оформления Python, все заглавные буквы могут быть использованы только в именах констант, но не переменных. Продолжая наш пример, добавим, даже если учесть, что DIV - это класс, это - особый класс, который никогда не должен быть изменен пользователем, так как это нарушит работу других web2py приложений. Таким образом, мы считаем, что нашу квалификацию класса DIV как константу, следует рассматривать в качестве оправдания нашего именования.

В заключении, следующие условные обозначения следуют:

  • HTML помощники и валидаторы обозначаются заглавными буквами по причинам, изложенным выше (например DIV, A, FORM, URL).
  • Объект переводчик T в верхнем регистре, несмотря на то, что он является экземпляром класса, а не самим классом. Логически объект переводчик выполняет действие, сходное с HTML-помощниками, он влияет на визуализацию части представления. Кроме того, имя T легко найти в коде и оно очень короткое.
  • DAL классы следуют руководству по стилю Python (заглавная первая буква), например Table, Field, Query, Row, Rows, и т.д.

Во всех остальных случаях мы полагаем, что следовали, насколько это возможно, за соблюдением правил Python Style Guide (PEP8). Например, имена всех объектов классов заданы строчными символами (request, response, session, cache), а все внутренние классы, именуются с первой заглавной буквы.

Во всех примерах этой книги о web2py ключевые слова выделены жирным шрифтом, а строки и комментарии - курсивом.

Лицензия

license

web2py распространяется под лицензией LGPL версии 3. Полный текст лицензии доступен по ссылке.[lgpl3].

В соответствии с LGPL вы можете:

  • распространять web2py с вашими приложениями (включая официальную бинарную версию web2py)
  • выпускать ваши приложения, которые используют официальные библиотеки web2py под любой лицензией, которую вы хотите

Тем не менее, вы должны:

  • четко указать в документации, что ваше приложение использует web2py
  • выпускать любую модификацию библиотек web2py под лицензией GPLv3

Лицензия включает в себя обычный отказ от ответственности:

НА ПРОГРАММУ НЕ РАСПРОСТРАНЯЮТСЯ НИКАКИЕ ГАРАНТИИ ДО РАМОК, ДОПУСТИМЫХ ПРИМЕНИМЫМ ЗАКОНОМ. ЕСЛИ ИНОЕ НЕ УСТАНОВЛЕНО В ПИСЬМЕННОЙ ФОРМЕ, ПРАВООБЛАДАТЕЛЬ И/ИЛИ ДРУГИЕ СТОРОНЫ ПРЕДОСТАВЛЯЮТ ПРОГРАММУ «КАК ЕСТЬ», БЕЗ КАКИХ ЛИБО ГАРАНТИЙ (ЗАЯВЛЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ), ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ПОДРАЗУМЕВАЕМЫМИ ГАРАНТИЯМИ ТОВАРНОГО СОСТОЯНИЯ ПРИ ПРОДАЖЕ И ГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННОГО ПРИМЕНЕНИЯ. ВЕСЬ РИСК КАК В ОТНОШЕНИИ КАЧЕСТВА, ТАК И ПРОИЗВОДИТЕЛЬНОСТИ ПРОГРАММЫ ВЫ БЕРЁТЕ НА СЕБЯ. ЕСЛИ В ПРОГРАММЕ ОБНАРУЖЕН ДЕФЕКТ, ВЫ БЕРЁТЕ НА СЕБЯ СТОИМОСТЬ НЕОБХОДИМОГО ОБСЛУЖИВАНИЯ, ПОЧИНКИ ИЛИ ИСПРАВЛЕНИЯ.

НИ В КОЕМ СЛУЧАЕ, ЕСЛИ НЕ ТРЕБУЕТСЯ ПРИМЕНИМЫМ ЗАКОНОМ ИЛИ ПИСЬМЕННЫМ СОГЛАШЕНИЕМ, НИ ОДИН ИЗ ПРАВООБЛАДАТЕЛЕЙ ИЛИ СТОРОН, ИЗМЕНЯВШИХ И/ИЛИ ПЕРЕДАВАВШИХ ПРОГРАММУ, КАК БЫЛО РАЗРЕШЕНО ВЫШЕ, НЕ ОТВЕТСТВЕНЕН ЗА УЩЕРБ, ВКЛЮЧАЯ ОБЩИЙ, КОНКРЕТНЫЙ, СЛУЧАЙНЫЙ ИЛИ ПОСЛЕДОВАВШИЙ УЩЕРБ, ВЫТЕКАЮЩИЙ ИЗ ИСПОЛЬЗОВАНИЯ ИЛИ НЕВОЗМОЖНОСТИ ИСПОЛЬЗОВАНИЯ ПРОГРАММЫ (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ПОТЕРЕЙ ДАННЫХ ИЛИ НЕВЕРНОЙ ОБРАБОТКОЙ ДАННЫХ, ИЛИ ПОТЕРИ, УСТАНОВЛЕННЫЕ ВАМИ ИЛИ ТРЕТЬИМИ ЛИЦАМИ, ИЛИ НЕВОЗМОЖНОСТЬ ПРОГРАММЫ РАБОТАТЬ С ДРУГИМИ ПРОГРАММАМИ), ДАЖЕ В СЛУЧАЕ ЕСЛИ ПРАВООБЛАДАТЕЛЬ ЛИБО ДРУГАЯ СТОРОНА БЫЛА ИЗВЕЩЕНА О ВОЗМОЖНОСТИ ТАКОГО УЩЕРБА.

Более ранние версии

Более ранние версии web2py, 1.0.*-1.90.*, были выпущены под лицензией GPL 2 плюс коммерческое исключение, которая, для практических целей, была очень похожа на текущую GPLv3.

Программы сторонних производителей, распространяемые с web2py

web2py содержит в папке gluon/contrib/ программное обеспечение сторонних производителей и различные JavaScript и CSS файлы. Эти файлы распространяются с web2py под своими оригинальными лицензиями, как указано в файлах.

Выражение благодарности

web2py первоначально был разработан и авторским правом обладает Massimo Di Pierro. Первая версия (1.0) была выпущена в октябре 2007 года. С тех пор она была принята многими пользователями, некоторые из которых также внесли свой вклад в виде отчетов об ошибках, тестирования, отладки, исправлений, и корректирования этой книги.

Некоторые из основных разработчиков и авторов являются, в алфавитном порядке по имени:

Adam Bryzak, Adam Gojdas, Adrian Klaver, Alain Boulch, Alan Etkin, Alec Taylor, Alexandre Andrade, Alexey Nezhdanov, Alvaro Justen, Anand Vaidya, Anatoly Belyakov, Ander Arbelaiz, Anders Roos, Andrew Replogle, Andrew Willimott, Angelo Compagnucci, Angelo and Villas, Annet Vermeer, Anthony Bastardi, Anton Muecki, Antonio Ramos, Arun Rajeevan, Attila Csipa, Ben Goosman, Ben Reinhart, Benjamin, Bernd Rothert, Bill Ferret, Blomqvist, Boris Manojlovic, Branko Vukelic, Brent Zeiben, Brian Cottingham, Brian Harrison, Brian Meredyk, Bruno Rocha, CJ Lazell, Caleb Hattingh, Carlos Galindo, Carlos Hanson, Carsten Haese, Cedric Meyer, Charles Law, Charles Winebrinner, Chris Clark, Chris May, Chris Sanders, Christian Foster Howes, Christopher Smiga, Christopher Steel, Clavin Sim, Cliff Kachinske, Corne Dickens, Craig Younkins, Dan McGee, Dan Ragubba, Dane Wright, Danny Morgan, Daniel Gonz, Daniel Haag, Daniel Lin, Dave Stoll, David Adley, David Harrison, David Lin, David Marko, David Wagner, Denes Lengyel, Diaz Luis, Dirk Krause, Dominic Koenig, Doug Warren, Douglas Philips, Douglas Soares de Andrade, Douglas and Alan, Dustin Bensing, Elcio Ferreira, Eric Vicenti, Erwin Olario, Falko Krause, Farsheed Ashouri, Felipe Meirelles, Flavien Scheurer, Fran Boon, Francisco Gama, Fred Yanowski, Friedrich Weber, Gabriele Alberti, Gergely Kontra, Gergely Peli, Gerley Kontra, Gilson Filho, Glenn Caltech, Graham Dumpleton, Gregory Benjamin, Gustavo Di Pietro, Gyuris Szabolcs, Hamdy Abdel-Badeea, Hans C. v. Stockhausen, Hans Donner, Hans Murx, Huaiyu Wang, Ian Reinhart Geiser, Iceberg, Igor Gassko, Ismael Serratos, Jan Beilicke, Jay Kelkar, Jeff Bauer, Jesus Matrinez, Jim Karsten, Joachim Breitsprecher, Joakim Eriksson, Joe Barnhart, Joel Carrier, Joel Samuelsson, John Heenan, Jon Romero, Jonas Rundberg, Jonathan Benn, Jonathan Lundell, Jose Jachuf, Joseph Piron, Josh Goldfoot, Josh Jaques, Jose Vicente de Sousa, Jurgis Pralgauskis, Keith Yang, Kenji Hosoda, Kenneth Lundstr, Kirill Spitsin, Kyle Smith, Larry Weinberg, Limodou, Loren McGinnis, Louis DaPrato, Luca De Alfaro, Luca Zachetti, Lucas D'Avila, Madhukar R Pai, Manuele Pesenti, Marc Abramowitz, Marcel Hellkamp, Marcel Leuthi, Marcello Della Longa, Margaret Greaney, Maria Mitica, Mariano Reingart, Marin Prajic, Marin Pranji, Marius van Niekerk, Mark Kirkwood, Mark Larsen, Mark Moore, Markus Gritsch, Mart Senecal, Martin Hufsky, Martin Mulone, Martin Weissenboeck, Mateusz Banach, Mathew Grabau, Mathieu Clabaut, Matt Doiron, Matthew Norris, Michael Fig, Michael Herman, Michael Howden, Michael Jursa, Michael Toomim, Michael Willis, Michele Comitini, Miguel Goncalves, Miguel Lopez, Mike Amy, Mike Dickun, Mike Ellis, Mike Pechkin, Milan Melena, Muhammet Aydin, Napoleon Moreno, Nathan Freeze, Niall Sweeny, Niccolo Polo, Nick Groenke, Nick Vargish, Nico de Groot, Nico Zanferrari, Nicolas Bruxer, Nik Klever, Olaf Ferger, Oliver Dain, Olivier Roch Vilato, Omi Chiba, Ondrej Such, Ont Rif, Oscar Benjamin, Osman Masood, Ovidio Marinho Falcao Neto, Pai, Panos Jee, Paolo Betti, Paolo Caruccio, Paolo Gasparello, Paolo Valleri, Patrick Breitenbach, Pearu Peterson, Peli Gergely, Pete Hunt, Peter Kirchner, Phyo Arkar Lwin, Pierre Thibault, Pieter Muller, Piotr Banasziewicz, Ramjee Ganti, Richard Gordon, Richard Ree, Robert Kooij, Robert Valentak, Roberto Perdomo, Robin Bhattacharyya, Roman Bataev, Ron McOuat, Ross Peoples, Ruijun Luo, Running Calm, Ryan Seto, Salomon Derossi, Sam Sheftel, Scott Roberts, Sebastian Ortiz, Sergey Podlesnyi, Sharriff Aina, Simone Bizzotto, Sriram Durbha, Sterling Hankins, Stuart Rackham, Telman Yusupov, Thadeus Burgess, Thomas Dallagnese, Tim Farrell, Tim Michelsen, Tim Richardson, Timothy Farrell, Tito Garrido, Tyrone Hattingh, Vasile Ermicioi, Vidul Nikolaev Petrov, Vidul Petrov, Vinicius Assef, Vladimir Donnikov, Vladyslav Kozlovsky, Vladyslav Kozlovskyy, Wang Huaiyu, Wen Gong, Wes James, Will Stevens, Yair Eshel, Yarko Tymciurak, Yoshiyuki Nakamura, Younghyun Jo, Zahariash.

Я уверен, что я забыл кого-то, поэтому я прошу прощения.

Я особенно благодарю Anthony, Simone, Richard, Jonathan, Mariano, Bruno, Vladyslav, Martin, Nathan, Thadeus, Tim, Iceberg, Denes, Hans, Christian, Fran and Patrick за их значительный вклад в web2py и Anthony, Alvaro, Brian, Bruno, Denes, Dane Denny, Erwin, Felipe, Graham, Jonathan, Hans, Kyle, Mark, Margaret, Michele, Nico, Richard, Roberto, Robin, Roman, Scott, Shane, Sharriff, Sriram, Sterling, Stuart, Thadeus, Wen (и другие) за корректирование различных версий этой книги. Их вклад был неоценим. Если вы обнаружите какие-либо ошибки в этой книге, то они исключительно моя вина и вероятно введены в последнюю минуту редактирования. Я также благодарю Ryan Steffen of Wiley Custom Learning Solutions за помощь с публикацией первого издания этой книги.

web2py содержит код от следующих авторов, которых я хотел бы поблагодарить:

Guido van Rossum for Python[python], Peter Hunt, Richard Gordon, Timothy Farrell for the Rocket[rocket] web server, Christopher Dolivet for EditArea[editarea], Bob Ippolito for simplejson[simplejson], Simon Cusack and Grant Edwards for pyRTF[pyrtf], Dalke Scientific Software for pyRSS2Gen[pyrss2gen], Mark Pilgrim for feedparser[feedparser], Trent Mick for markdown2[markdown2], Allan Saddi for fcgi.py, Evan Martin for the Python memcache module[memcache], John Resig for jQuery[jquery].

Я благодарю Helmut Epp (проректора DePaul University), David Miller (декана College of Computing and Digital Media of DePaul University), and Estia Eichten (члена MetaCryption LLC), за их постоянное доверие и поддержку.

В заключение я хотел бы поблагодарить мою жену, Claudia, и моего сына, Marco, за терпение со мной в течение многих часов, которые я провел за разработкой web2py, переписываться с пользователями и сотрудниками, и писал эту книгу. Эта книга посвящена им.

 top