Chapter 1: Введение

Введение

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

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

Web2py разделён на три части:

  • model - БД. Приём данных из контроллера для хранения в БД, выдача данных в контроллер для обработки.
  • view - шаблон HTML-страницы. Приём визуализируемых данных из БД (model) через контроллер, управляющий подстановкой этих данных в шаблон HTML-страницы и выдача готовой HTML-страницы в браузер пользователя.
  • controller - обработка данных. Приём данных из браузера пользователя, вызов соответствующей функции контроллера, приём визуализируемых данных из БД (model), выдача данных в БД (model) для хранения

Модель и шаблон не связаны напрямую, а только через контроллер:

                                    model
                                        | ^
                                       v |            
		view<--------------controller
		|                      ^
		v                      |
		+----->browser------->+

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

Web2py построен c учётом обеспечения безопасности. Это означает, что он автоматически решает многие вопросы, которые могут привести к появлению уязвимостей в системе безопасности. Например, он проверяет все входные данные ( для предотвращения иньекций во входные данные), экранирует все выходные данные ( для предотвращения cross-site scripting атак), переименовывает загружаемые файлы ( для предотвращения directory traversal атак). Web2py не оставляет "прорех" в безопасности, требующих "латания" разработчиком приложения.

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

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

Web2py отличается от других подобных Фреймворков тем, что он единственный Фреймворк, полностью поддерживающий парадигму Web 2.0. В самом деле, web2py:

  • не требует установки и конфигурации,
  • может работать на любой платформе и архитектуре, где может работать Python (Windows, Windows CE, Mac OS X, iPhone и Unix/Linux),
  • позволяет проводить разработку, развёртывание, внедрение и обслуживание приложения локально или через web-интерфейс.
  • работает с двумя реализациями языка Python: CPython (реализация на языке C) или с Jython (реализация на языке Java), версий 2.4, 2.5 и 2.6, и 2.7 хотя "официально" поддерживают только версию Python 2.5, иначе нельзя гарантировать обратную совместимость будущих версий web2py c существующими приложениями.

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

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

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

Некоторые примеры, иллюстрирующие его мощь и простоту:

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

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

Для созданной таблицы код формы будет иметь следующей вид

form = crud.create(db.person)

Это условное выражение делает много работы:

  • проверяет данные формы после их отправки на сервер,
  • переименовывает загруженное изображение из соображений безопасности,
  • сохраняет изображение в файле,
  • вставляет в БД новую запись с введённым именем и ссылкой на файл изображения,
  • предотвращает двойную отправку формы на сервер,
  • изменяет саму форму путем добавления сообщения об ошибке, если данные, введённые в неё пользователем, не прошли проверку.

А следующий код:

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

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

The following code embeds a page component. Следующий код уже включенный в страницы компонентов.

{{=LOAD('other_controller','function.load',ajax=True, ajax_trap=True)}}

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

LOAD helper позволяет использовать модульный дизайн приложений; более подробно рассмотрим в последних главах книги.

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

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

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

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

Web2py отличается от других Фреймворков отношением к третьему принципу, который иногда вступает в противоречия с двумя другими. В частности, web2py автоматически импортирует свои собственные модули и создает экземпляры глобальных объектов (request, response, session, cache, T), и это делается скрытно. Для некоторых это может показаться магией, но это не так. Web2py пытается избежать надоедливых характеристик других Фреймворков, которые заставляют разработчика импортировать одни и те же модули в верхней части текста каждой модели или контроллера.

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

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

Web frameworks

PHP
ASP
JSP

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

Задача web фреймворков это позволить разработчики построить новое приложение быстро, легко и без ошибок.

The two classic approaches for developing web applications are:

  • Generating HTML[html-w] [html-o] programmatically.
  • Embedding code into HTML pages.

При разработке веб-приложений используются два классических подхода:

  • программное создание HTML-кода [html-w] [html-o] и встраивание его кусков в текст программы.
  • встраивание кусков кода, написанных на языке программирования в HTML-код.

Первый подход использовался, например, в ранних CGI-сценариях. Второй подход применяется, например:

  • в 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)))

In this simple example, the HTML page structure is represented programmatically by the HTML, BODY, and H1 objects; the database db is queried by the select command; finally, everything is serialized into HTML.

В этом простом примере, структура HTML-страницы представлена программно с помощью HTML, BODY, и H1 объектов, а также объекта соединения с БД - db. После выполнения запроса к БД полученные данные сериализуется в HTML.

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

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

  • автоматической обработки куков,
  • сессий,
  • создание таблиц базы данных,
  • внесения изменений в структуру БД
  • проверки HTML-форм,
  • профилактики SQL-инъекций,
  • предотвращения межсайтового скриптинга (XSS),
  • реализации многих других необходимых функций веб-приложения.

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

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

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

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

Шаблон проектирования MVC (Model-View-Controller)

Model-View-Controller

web2py силами разработчика разделён на три отдельных части:

  • хранение данных (model),
  • визуализация данных (view)
  • Преобразование данных (controller).

image

Типичная последовательность действий при обработке запроса пользователя показана на следующей диаграмме:

image

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

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

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

"db.py" это модель:

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

Здесь производится подключение к БД (в данном примере используется СУБД SQLite, база данных хранится в файле storage.sqlite) и определяется таблица с именем contact.

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

Не нужно менять код приложения, кроме строки соединения с БД: db = DAL('sqlite://storage.sqlite')

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

"default.py" это контроллер:

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

Функция contacts() - это интернет-функция контроллера (ИФК), которую можно вызвать удалённо с клиентского браузера.

В отличие от обычной функции контроллера, которая должна иметь параметры, ИФК не должна иметь параметров!

В web2py, URLы отображаются (mapятся) на Python модули и функции. В этом случае контроллер содержит одну функцию(или "действие"), называемую contacts. Функция может вернуть строку (вернуть веб страницу) или Python словарь (набор пар {ключ: значение}) или множество локальных переменных ( как в нашем примере). Если функция возвращает словарь, то он передается в шаблон, который имеет то же имя, что и ИФК, но расширение html, и находится в каталоге с именем "view/default". В этом примере функция contacts() выполняет выборку из БД и возвращает результат records в виде словаря.

В этом примере функция contacts генерирует грид для select/search/create/update/delete операций ( для таблицы db.contact)

"default/contacts.html" это шаблон:

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

Этот шаблон web2py вызывает автоматически после того, как соответствующая функция контроллера выполнена. Целью этого шаблона является вставка переменных из словаря, возвращённого ИФК (в нашем случае grid), в HTML-код страницы.

Шаблон - это HTML-файл, содержащий HTML-код, в который встроены куски Python-кода, отделённые от HTML-кода специальными парными скобками {{ и }} Это отличается от PHP, тем что в HTML-код встраивается только Python-код "уровня шаблона".

"layout.html" - это файл базового шаблона - основа всех шаблонов для всех web2py приложений. Этот файл может быть легко отредактирован или заменён.

Why web2py ?

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

  • легок в изучении server -side разработки web приложений
  • не требует установки,
  • не требует настройки,
  • не имеет зависимостей (за исключением случая распространения web2py в виде исходного кода, что требует установки Python 2.5),
  • предоставляет большую часть своей функциональности через веб-интерфейс.

Web2py был стабильным с самого первого дня, поскольку его разработка происходила "сверху-вниз", т.е. его API был разработан до момента его реализации.

  • Web2py никогда не нарушал принципа обратной совместимости, даже после

добавления новой функциональности. В web2py активно решаются наиболее важные вопросы безопасности, которые затрудняют работу многих современных веб-приложений, как это определено ниже проектом OWASP [owasp] .

  • Web2py небольшой Фреймворк. Его основные библиотеки, в том числе DAL, язык шаблонов и все HTML-помощники занимают не более 1.4 Мб. Весь исходный код, включая примеры приложений, занимает не более 10.4MB.
  • Web2py очень быстр. Он использует WSGI-совместимый веб-сервер Rocket [rocket] разработанный Timothy Farrell. Он быстрей Apache при использовании mod_wsgi. Наши тесты также показывают, что на среднем PC, он обслуживает динамическую страницу без доступа к БД в среднем, за 10 мс. DAL вносит очень небольшие накладные расходы, которые составляют, как правило, менее 3-х процентов.
  • web2py использует синтаксис языка Python для моделей, контроллеров, и файлов вида, но обратите внимание web2py не импортирует модели и контроллеры ( как другие python Фреймворки) а выполняет их, это означает что приложения могут быть установлены, удалены, модифицированы без рестарта web сервера ( даже в production) , и различные приложения могут сосуществовать без взаимных интерференций друг на друга.
  • web2py uses a Database Abstraction Layer (DAL) instead of an Object Relational Mapper (ORM). From a conceptual point of view, this means that different database tables are mapped into different instances of one Table class and not into different classes, while records are mapped into instances of one Row class, not into instances of the corresponding table class. From a practical point of view, it means that SQL syntax maps almost one-to-one into DAL syntax, and there is no complex metaclass programming going on under the hood as in popular ORMs, which would add latency.

WSGI [wsgi-w] [wsgi-o] (Web Server Gateway Interface) is an emerging Python standard for communication between a web server and Python applications).

Скриншот интерфейса администрирования admin :

image

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

security

Проект обеспечения безопасности открытых web-приложений (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): подделка запроса - это нападение злоумышленника на сервер через браузер жертвы с целью направления запроса от добропорядочного пользователя. После установление сервером личности пользователя злоумышленник может атаковать веб-приложение." В связи с этим web2py хранит всю информацию о сессии на стороне сервера, а на стороне клиента, в куки браузера, хранится только идентификатор сессии. Кроме того, web2py предотвращает двойную отправку формы на сервер путем присвоения каждой форме специального маркера, который генерируется случайным образом.
  • information leakage
    improper error handling
    "Information Leakage and Improper Error Handling: Утечка информации и неправильная обработка ошибок. Приложения могут допускать непреднамеренную утечку информации об их конфигурации, внутренней работе, или нарушать неприкосновенность частной жизни пользователей из-за различных проблем. Злоумышленники пользуются этим для кражи конфиденциальных данных или для более серьезных атак." Web2py включает ticketing system - систему управления ошибками. Сообщение об ошибке не выводится пользователю. Все ошибки регистрируются в талонах, а талоны соответствует пользователям, что позволяет администратору позже отслеживать ошибки. Ошибка, также как и исходный код модуля в котором она возникла, доступны только администратору.
  • "Broken Authentication and Session Management: Разрушение процедур идентификации или управления сессиями: Учет полномочий пользователей и идентификаторы сессий часто защищены не надлежащим образом. Злоумышленники компрометируют пароли, ключи или идентификаторы сессии предполагая, что они идентичны у всех пользователей." web2py обеспечивает встроенный механизм идентификации для администратора, когда он управляет сессиями независимо для каждого приложения. Административный интерфейс обеспечивает безопасность сессионных куки, когда клиент пришёл не c localhost. Для приложений, он включает в себя мощный API управления доступом пользователей на основе ролей (Role Based Access Control - RBAC).
  • cryptographic store
    "Insecure Cryptographic Storage: Ненадёжное шифрование при хранении данных: Web-приложения редко используют криптографические функции надлежащим образом, чтобы защитить данные и полномочия пользователей. Злоумышленники используют слабо защищенные данные для осуществления краж идентификационной информации и других преступлений, таких как мошенничество с кредитными картами." При хранении паролей web2py использует алгоритмы шифрования MD5 или HMAC + SHA-512. Другие алгоритмы также доступны.
  • secure communications
    "Insecure Communications: Небезопасная связь. Приложения часто не используют шифрование сетевого трафика, когда это необходимо для защиты конфиденциальных данных." web2py включает Rocket WSGI-сервер с возможностью шифрования сообщений по протоколу SSL [ssl] , но он может также использовать Apache или Lighttpd с mod_ssl обеспечивая SSL-шифрование сообщений.
  • access restriction
    "Failure to Restrict URL Access: Неспособность ограничить доступ по URL. Часто приложение защищает только чувствительные функции, предотвращая срабатывание ссылок или доступ по URL для неавторизованных пользователей. Злоумышленники могут использовать эту слабость для выполнения несанкционированных операций с помощью прямого доступа по URL." web2py отображает URL-запросы на Python-модули и ИФК. web2py имеет механизм для объявления некоторых функций публичными, что требует от пользователя, вызвавшего их, прохождения процедур авторизации и проверки подлинности. API RBAC позволяет разработчикам ограничивать доступ к любой ИФК с помощью авторизации входа, членства в группе и прав, предоставленных членам группы, основанных на разрешениях. Разрешения достаточно сильно измельчены (гранулированы) и могут быть использованы в комбинации с CRUD, позволяя, например, предоставлять доступ к конкретным таблицам и/или записям.

web2py was reviewed for security and you can find the result of the review in ref.[pythonsecurity].

In the box

Вы можете скачать 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 или Jython, включая вышеупомянутые ОС. Чтобы запустить web2py из исходных кодов, вы должны иметь Python 2.5, предварительно установленный в системе. Кроме того, необходимо, чтобы была установлена одна из СУБД, поддерживаемых web2py. Для тестирования небольших приложений, вы можете использовать СУБД SQLite, включённую в состав дистрибутива Python 2.5.

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

The following image depicts the overall web2py structure:

image

License

license

web2py is licensed under the LGPL version 3 License. The full text of the license if available in ref.[lgpl3].

In accordance with LGPL you may:

  • redistribute web2py with your apps (including official web2py binary versions)
  • release your applications which use official web2py libraries under any license you wish

Yet you must:

  • make clear in the documentation that your application uses web2py
  • release any modification of the web2py libraries under the LGPLv3 license

The license includes the usual disclaimer:

THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

Earlier versions

Earlier versions of web2py, 1.0.*-1.90.*, were released under the GPL2 license plus a commercial exception which, for practical purposes, was very similar to the current LPGLv3.

Third party software distributed with web2py

web2py contains third party software under the gluon/contrib/ folder and various JavaScript and CSS files. These files are distributed with web2py under their original licenses, as stated in the files.

Благодарности

web2py was originally developed by and copyrighted by Massimo Di Pierro. The first version (1.0) was released in October, 2007. Since then it has been adopted by many users, some of whom have also contributed bug reports, testing, debugging, patches, and proofreading of this book.

Some of the major contributors are, in alphabetical order by first name:

Alexey Nezhdanov, Alvaro Justen, Andrew Willimott, Angelo Compagnucci, Anthony Bastardi, Antonio Ramos, Arun K. Rajeevan, Attila Csipa, Ben Reinhart, Bill Ferret, Boris Manojlovic, Branko Vukelic, Brian Meredyk, Bruno Rocha, Carlos Galindo, Carsten Haese, Chris Clark, Chris Steel, Christian Foster Howes, Christopher Smiga, CJ Lazell, Cliff Kachinske, Craig Younkins, Daniel Lin, David Harrison, David Wagner, Denes Lengyel, Dirk Krause, Douglas Soares de Andrade, Eric Vicenti, Falko Krause, Farsheed Ashouri, Fran Boon, Francisco Gama, Fred Yanowski, Gilson Filho, Graham Dumpleton, Gyuris Szabolcs, Hamdy Abdel-Badeea, Hans Donner, Hans Murx, Hans C. v. Stockhausen, Ian Reinhart Geiser, Ismael Serratos, Jan Beilicke, Jonathan Benn, Jonathan Lundell, Josh Goldfoot, Jose Jachuf, Josh Jaques, José Vicente de Sousa, Keith Yang, Kenji Hosoda, Kyle Smith, Limodou, Lucas D'Ávila, Marcel Leuthi, Marcel Hellkamp, Marcello Della Longa, Mariano Reingart, Mark Larsen, Mark Moore, Markus Gritsch, Martin Hufsky, Martin Mulone, Mateusz Banach, Miguel Lopez, Michael Willis, Michele Comitini, Nathan Freeze, Niall Sweeny, Niccolo Polo, Nicolas Bruxer, Olaf Ferger, Omi Chiba, Ondrej Such, Ovidio Marinho Falcao Neto, Pai, Paolo Caruccio, Patrick Breitenbach, Phyo Arkar Lwin, Pierre Thibault, Ramjee Ganti, Robin Bhattacharyya, Ross Peoples, Ruijun Luo, Ryan Seto, Scott Roberts, Sergey Podlesnyi, Sharriff Aina, Simone Bizzotto, Sriram Durbha, Sterling Hankins, Stuart Rackham, Telman Yusupov, Thadeus Burgess, Tim Michelsen, Timothy Farrell, Yair Eshel, Yarko Tymciurak, Younghyun Jo, Vidul Nikolaev Petrov, Vinicius Assef, Vladyslav Kozlovskyy, Zahariash.

I am sure I forgot somebody, so I apologize.

I particularly thank Anthony, Jonathan, Mariano, Bruno, Vladyslav, Martin, Nathan, Simone, Thadeus, Tim, Iceberg, Denes, Hans, Christian, Fran and Patrick for their major contributions to web2py and Anthony, Alvaro, Bruno, Denes, Felipe, Graham, Jonathan, Hans, Kyle, Mark, Michele, Richard, Robin, Roman, Scott, Shane, Sharriff, Sriram, Sterling, Stuart, Thadeus (and others) for proofreading various versions of this book. Their contribution was invaluable. If you find any errors in this book, they are exclusively my fault, probably introduced by a last-minute edit. I also thank Ryan Steffen of Wiley Custom Learning Solutions for help with publishing the first edition of this book.

web2py contains code from the following authors, whom I would like to thank:

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

The cover of this book was designed by Peter Kirchner at Young Designers.

I thank Helmut Epp (provost of DePaul University), David Miller (Dean of the College of Computing and Digital Media of DePaul University), and Estia Eichten (Member of MetaCryption LLC), for their continuous trust and support.

Finally, I wish to thank my wife, Claudia, and my son, Marco, for putting up with me during the many hours I have spent developing web2py, exchanging emails with users and collaborators, and writing this book. This book is dedicated to them.

About this book

This book includes the following chapters, besides this introduction:

  • Chapter 2 is a minimalist introduction to Python. It assumes knowledge of both procedural and object-oriented programming concepts such as loops, conditions, function calls and classes, and covers basic Python syntax. It also covers examples of Python modules that are used throughout the book. If you already know Python, you may skip Chapter 2.
  • Chapter 3 shows how to start web2py, discusses the administrative interface, and guides the reader through various examples of increasing complexity: an application that returns a string, a counter application, an image blog, and a full blown wiki application that allows image uploads and comments, provides authentication, authorization, web services and an RSS feed. While reading this chapter, you may need to refer to Chapter 2 for general Python syntax and to the following chapters for a more detailed reference about the functions that are used.
  • Chapter 4 covers more systematically the core structure and libraries: URL mapping, request, response, sessions, caching, cron, internationalization and general workflow.
  • Chapter 5 is a reference for the template language used to build views. It shows how to embed Python code into HTML, and demonstrates the use of helpers (objects that can generate HTML).
  • Chapter 6 covers the Database Abstraction Layer, or DAL. The syntax of the DAL is presented through a series of examples.
  • Chapter 7 covers forms, form validation and form processing. FORM is the low level helper for form building. SQLFORM is the high level form builder. In Chapter 7 we also discuss the Create/Read/Update/Delete (CRUD) API.
  • Chapter 8 covers communication with as sending emails and SMSes.
  • Chapter 9 covers authentication, authorization and the extensible Role-Based Access Control mechanism available in web2py. Mail configuration and CAPTCHA are also discussed here, since they are used for authentication. In the third edition of the book we have added extensive coverage of integration with third-party authentication mechanisms such as OpenID, OAuth, Google, Facebook, LinkedIn, etc.
  • Chapter 10 is about creating web services in web2py. We provide examples of integration with the Google Web Toolkit via Pyjamas, and with Adobe Flash via PyAMF.
  • Chapter 11 is about web2py and jQuery recipes. web2py is designed mainly for server-side programming, but it includes jQuery, since we have found it to be the best open-source JavaScript library available for effects and Ajax. In this chapter, we discuss how to effectively use jQuery with web2py.
  • Chapter 12 discusses web2py components and plugins as a way to build modular applications. We provide an example of a plugin that implements many commonly used functionality, such as charting, comments, tagging, and wiki.
  • Chapter 13 is about production deployment of web2py applications. We mainly address three possible production scenarios: on a Linux web server or a set of servers (which we consider the main deployment alternative), running as a service on a Microsoft Windows environment, and deployment on the Google Applications Engine. In this chapter, we also discuss security and scalability issues.
  • Chapter 14 contains a variety of other recipes to solve specific tasks, including upgrades, geocoding, pagination, the Twitter API, and more.

This book only covers basic web2py functionalities and the API that ships with web2py. This book does not cover web2py appliances (i.e. ready made applications).

You can download web2py appliances from the corresponding web site [appliances].

You can find additional topics discussed on the usergroup[usergroup]. There is also AlterEgo[alterego], the old web2py blog and FAQ.

MARKMIN

This book has been written using the markmin syntax and automatically converted to HTML, LaTeX and PDF.

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

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

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

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

In summary, the following conventions are followed:

  • HTML helpers and validators are all upper case for the reasons discussed above (for example DIV, A, FORM, URL).
  • The translator object T is upper case despite the fact that it is an instance of a class and not a class itself. Logically the translator object performs an action similar to the HTML helpers, it affects rendering part of the presentation. Also, T needs to be easy to locate in the code and must have a short name.
  • DAL classes follow the Python style guide (first letter capitalized), for example Table, Field, Query, Row, Rows, etc.

Таким образом, мы используем следующие соглашения:

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

In all other cases we believe we have followed, as much as possible, the Python Style Guide (PEP8). For example all instance objects are lower-case (request, response, session, cache), and all internal classes are capitalized.

In all the examples of this book, web2py keywords are shown in bold, while strings and comments are shown in italic.

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

 top