Учебники

Web2py — Core

Мы узнали, как запустить сервер web2py с помощью графического интерфейса в предыдущей главе.

Этот виджет можно пропустить, запустив сервер из командной строки.

python web2py.py -a ‘ваш пароль’ -i 127.0.0.1 -p 8000

Каждый раз, когда запускается сервер web2py, он создает файл « parameters_8000.py », в котором все пароли хранятся в хешированной форме.

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

python web2py.py -a '<recycle>' -i 127.0.0.1 -p 8000

Для описанного выше сценария web2py повторно использует хешированные пароли, хранящиеся в » parameters_8000.py «.

В случае, если файл « parameters_8000.py » удален случайно или по каким-либо другим причинам, веб-интерфейс администрирования отключается в web2py.

Отображение URL / Диспетчеризация

Функционирование web2py основано на модели-view-controller, которая отображает URL-адрес в определенной форме — http://127.0.0.1:8000/a/d/f.html.

Он маршрутизируется до тех пор, пока функция «f ()», упомянутая в контроллере d.py, не окажется в приложении с именем «a». Если контроллер отсутствует в приложении, то web2py использует контроллер по умолчанию с именем «default.py» .

Если функция, указанная в URL, отсутствует, то используется функция по умолчанию init () . Работа URL-адреса схематично показана на изображении ниже.

Функция Init

Расширение .html необязательно для URL. Расширение определяет расширение View, которое отображает выходные данные функции, определенной в контроллере. Один и тот же контент подается в нескольких форматах, а именно: HTML, XML, JSON, RSS и т. Д.

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

web2py — рабочий процесс

Рабочий процесс web2py обсуждается ниже —

  • Веб-сервер управляет каждым HTTP-запросом одновременно в своем собственном потоке.

  • Заголовок HTTP-запроса анализируется и передается диспетчеру.

  • Диспетчер управляет запросами приложения и отображает PATH_INFO в URL-адресе вызова функции. Каждый вызов функции представлен в URL.

  • Все запросы на файлы, включенные в статическую папку, обрабатываются напрямую, а большой файл передается клиенту.

  • Запросы на что-либо кроме статического файла отображаются в действии.

  • Если заголовок запроса содержит файл cookie сеанса для приложения, объект сеанса извлекается; или же, идентификатор сеанса создан.

  • Если действие возвращает значение в виде строки, оно возвращается клиенту.

  • Если действие возвращает итерируемое, оно используется для зацикливания и потоковой передачи данных клиенту.

Веб-сервер управляет каждым HTTP-запросом одновременно в своем собственном потоке.

Заголовок HTTP-запроса анализируется и передается диспетчеру.

Диспетчер управляет запросами приложения и отображает PATH_INFO в URL-адресе вызова функции. Каждый вызов функции представлен в URL.

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

Запросы на что-либо кроме статического файла отображаются в действии.

Если заголовок запроса содержит файл cookie сеанса для приложения, объект сеанса извлекается; или же, идентификатор сеанса создан.

Если действие возвращает значение в виде строки, оно возвращается клиенту.

Если действие возвращает итерируемое, оно используется для зацикливания и потоковой передачи данных клиенту.

Условные Модели

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

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

Рассмотрим URL — http://127.0.0.1:8000/a/d/f.html

В этом случае «a» — это имя приложения, «d» — это имя контроллера, а f () — функция, связанная с контроллером. Список моделей, которые будут выполнены, таков:

applications/a/models/*.py
applications/a/models/d/*.py
applications/a/models/d/f/*.py

Библиотеки

web2py включает в себя библиотеки, которые выставляются всем приложениям как объекты. Эти объекты определены внутри основных файлов в каталоге с именем «gluon».

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

Приложения

Приложения web2py показаны ниже в виде диаграммы.

Схематическая форма

Приложения, разработанные в web2py, состоят из следующих частей:

  • Модели — Представляет данные и таблицы базы данных.

  • Контроллеры — Описывает логику приложения и рабочий процесс.

  • Представления — Помогает рендеринга отображения данных.

  • Языки — опишите, как переводить строки в приложении на различные поддерживаемые языки.

  • Статические файлы — не требуют обработки (например, изображения, таблицы стилей CSS и т. Д.).

  • О и README — Детали проекта.

  • Ошибки — хранит отчеты об ошибках, сгенерированные приложением.

  • Сессии — хранит информацию, связанную с каждым конкретным пользователем.

  • Базы данных — храните базы данных SQLite и дополнительную информацию о таблицах.

  • Кэш — Хранить кэшированные элементы приложения.

  • Модули. Модули — это другие дополнительные модули Python.

  • Приватный — включенные файлы доступны для контроллеров, но не напрямую для разработчика.

  • Загрузка — файлы доступны моделям, но не напрямую разработчику.

Модели — Представляет данные и таблицы базы данных.

Контроллеры — Описывает логику приложения и рабочий процесс.

Представления — Помогает рендеринга отображения данных.

Языки — опишите, как переводить строки в приложении на различные поддерживаемые языки.

Статические файлы — не требуют обработки (например, изображения, таблицы стилей CSS и т. Д.).

О и README — Детали проекта.

Ошибки — хранит отчеты об ошибках, сгенерированные приложением.

Сессии — хранит информацию, связанную с каждым конкретным пользователем.

Базы данных — храните базы данных SQLite и дополнительную информацию о таблицах.

Кэш — Хранить кэшированные элементы приложения.

Модули. Модули — это другие дополнительные модули Python.

Приватный — включенные файлы доступны для контроллеров, но не напрямую для разработчика.

Загрузка — файлы доступны моделям, но не напрямую разработчику.

API

В web2py модели , контроллеры и представления выполняются в среде, где определенные объекты импортируются для разработчиков.

Глобальные объекты — запрос, ответ, сессия, кеш.

Помощники — web2py включает вспомогательный класс, который можно использовать для программной сборки HTML. Он соответствует тегам HTML, которые называются «помощниками HTML» .

Например, A, B, FIELDSET, FORM и т. Д.

сессия

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

Сеанс в web2py является экземпляром класса хранилища.

Например, переменная может быть сохранена в сеансе как

session.myvariable = "hello"

Это значение можно получить как

a = session.myvariable

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

Одним из важных методов в web2py для сессии является «забыть»

session.forget(response);

Он инструктирует web2py не сохранять сессию.

Запуск задач в фоновом режиме

HTTP-запрос поступает на веб-сервер, который обрабатывает каждый запрос в своем собственном потоке, параллельно. Задание, которое активно, выполняется на переднем плане, а остальные остаются в фоновом режиме. Управление фоновыми задачами также является одной из основных функций web2py.

Трудоемкие задачи желательно держать в фоновом режиме. Ниже перечислены некоторые механизмы, которые управляют фоновыми задачами.

  • CRON

  • Очереди

  • планировщик

CRON

Очереди

планировщик

CRON

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

планировщик

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

Запланированные события перечислены в моделях с именем файла «scheduler.py» .

Создание приложения

У нас был обзор создания моделей и контроллеров в web2py. Здесь мы сосредоточимся на создании приложения под названием «Контакты» . Приложение должно вести список компаний и список людей, которые работают в этих компаниях.

Создание модели

Здесь идентификация таблиц для словаря данных является моделью. Модель для приложения контактов будет создана в папках « models ». Файл хранится в models / db_contacts.py .

# in file: models/db_custom.py
db.define_table('company', Field('name', notnull = True, unique = True), format = '%(name)s')
db.define_table(
   'contact',
   Field('name', notnull = True),
   Field('company', 'reference company'),
   Field('picture', 'upload'),
   Field('email', requires = IS_EMAIL()),
   Field('phone_number', requires = IS_MATCH('[\d\-\(\) ]+')),
   Field('address'),
   format = '%(name)s'
)

db.define_table(
   'log',
   Field('body', 'text', notnull = True),
   Field('posted_on', 'datetime'),
   Field('contact', 'reference contact')
)

После создания вышеуказанного файла к таблицам можно получить доступ с помощью URL-адреса http://127.0.0.1:8000/contacts/appadmin.

Создание контроллера

Контроллер будет включать в себя некоторые функции для просмотра, редактирования и удаления контактов.

# in file: controllers/default.py
def index():return locals()
def companies():companies = db(db.company).select(orderby = db.company.name)
return locals()

def contacts():company = db.company(request.args(0)) or redirect(URL('companies'))
contacts = db(db.contact.company == company.id).select(orderby = db.contact.name)
return locals()

@auth.requires_login()
def company_create():form = crud.create(db.company, next = 'companies')
return locals()

@auth.requires_login()
def company_edit():company = db.company(request.args(0)) or redirect(URL('companies'))
form = crud.update(db.company, company, next='companies')
return locals()

@auth.requires_login()
def contact_create():db.contact.company.default = request.args(0)
form = crud.create(db.contact, next = 'companies')
return locals()

@auth.requires_login()
def contact_edit():contact = db.contact(request.args(0)) or redirect(URL('companies'))
form = crud.update(db.contact, contact, next = 'companies')
return locals()

def user():return dict(form = auth())

Создание представления вместе с его выводом будет обсуждаться в следующей главе.