Мы узнали, как запустить сервер 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-адреса схематично показана на изображении ниже.
Расширение .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())
Создание представления вместе с его выводом будет обсуждаться в следующей главе.