Предыдушая статья - Web-приложение: 1. Теория
Для упрощения подготовки базы ланных postgresql нашего приложения можно использовать python-скрипт webapp-db.py.
Скрипт написан как исполняемый файл и основан на работе python-библиотеки argparse. Поэтому работать со скриптом можно в двух режимах - пошаговом и пакетном. В пошаговом режиме вызов скрипта выполняется из командной строки с указанием необходимых аргументов. В пакетном режиме необходимо изменить блок скрипта main, вызывая необходимые функции с аргументами через метод argparse.parse_args(). Примеры вызова метода приведены в теле скрипта.
Вызов скравки по аргументам скрипта
0. Конфигурация скрипта
Конфигурация вынесена в отдельный файл - params.py, который содержит настройки подключения к серверу базы данных postgresql. Важно! Все действия скрипта выполняются от имени суперпользователя postgresql.
1. Создание приложения
./webapp-db.py -a mywebapp create -u webuser -p 12345
где:
- -а mywebapp - агрумент, указывающий, что мы обращаемся к приложению mywebapp
- create - команда, указывающая, что мы хотим создать приложение с таким именем
- -u webuser -p 12345 - указываем, что все пользовательские запросы будут обращаться к базе данных приложения от имени нового пользователя 'webuser', имеющего пароль '12345'
На данном шаге скрипт создает: а) новую базу данных приложения, б) схемы config, logs в этой базе и в) наполняет их необходимыми объектами. Далее скрипт создает нового пользователя на сервере базы данных (если пользователя с таким именем не существует) и наделяет его правами, необходимыми только для работы с приложением.
Если пользователь с указанным именем уже существует, то этот шаг пропускается, но изменяются привелегии пользователя
2. Проверка прав пользователя.
Целесообразно убедиться (с точки зрения безопасности), что созданный пользователь не имеет доступа к другим базам данных и объектам, хранящимся на нашем сервере баз данных. Для этого сначала запускаем скрипт с параметрами.
./webapp-db.py view
Скрипт вернет список всех баз данных сервера.
Теперь, чтобы проверить права доступа нашего пользователя к объектам любой из баз данных, выполним команду
./webapp-db.py -a mywebapp view -u webuser
Скрипт не предусматривает возможность последующего изменения (по необходимости) прав пользователя к базам данных и объектам. Делать это нужно будет вручную или заранее внести изменения в sql-скрипт user_role.sql - именно он управляет созданием пользователя и выделением прав для него.
3. Добавление проекта в приложение
./webapp-db.py -a mywebapp add project <project_name>
Команда добавляет проект в конфигурацию приложения и создает в базе соотвествующую схему, в которой будут храниться таблицы данных проекта.
4. Добавление группы привелегий в проект
Согласно логике работы приложения, описанной в первой статье, при добавлении в приложение нового проекта, скрипт автоматически создает для него группу для анонимных пользователей. Группы для авторизованных пользователей добавляются командой
./webapp-db.py -a mywebapp add group newproject -g group1
Имя группы должно быть уникально в рамках проекта
5. Добавление пользователя приложения
Для корректного добавления нового пользователя приложения нужно указать три его параметра: имя, пароль, контактную электронную почту. Обязательным является только имя. Если другие параметры не заданы - скрипт выдаст предупреждение но пользователя создаст.
./webapp-db.py -a mywebapp add user newproject -g group1 -u user1 -p password -m osr@mail.ru
Имя пользователя в приложении должно быть уникально для всех проектов
6. Добавление шаблона запроса в проект
Здесь нужно помнить, что привелегии задаются тремя типами ограничений:
- количество запросов (в час), которое может выпольнить пользователь (count, число)
- интервал времени, через который пользовател может выполнить очередной запрос к проекту согласно установленной для него группы привелегий (timeout, число)
- количество записей результата запроса, возвращаемых пользователю согласно группы привелений проекта (record, число)
Полная команда добавления запроса в проект выглядит так
./webapp-db.py -a mywebapp add query newproject -g group1 --alias query1 --query 'select * from table1' --rules 'count=1, timeout=2, record=3'
Новыми здесь являются аргументы
- (--alias) - псевдоним запроса, обязательный не пустой параметр
- (--query) - шаблон запроса, обязательный не пустой параметр. О том, как составлять шаблоны, читать ниже
- (--rules) - привелегии шаблона для группы, указанной в аргументе -g
При добавлении нового запроса привелегии можно не указывать. Тогда команда создаст запрос а поле привелегий оставить пустым. Это означает, что ни одна группа проекта не имеет прав на выполнение данного запроса.
При определении привелегий можно задавать не все типы ограничений, а только необходимые. Для незаданных ограничений значения будут нулевые. Вниание! нулевое значени означает отсутсвие ограничения
Важно понимать, что добавляемый запрос может содержать привелегии для одной или нескольких групп проекта. Но указанная выше команда добавляет новый запрос и создает привелегии только для одной группы. Для того, чтобы управлять привилегиями запроса используется все та же комманда 'add query', но с определенным набором аргументов:
- необходимо указать псевдоним существующего запроса (--alias), иначе будет предпринята попытка добавления нового запроса
- необходимо указать группу привелегий (-g)
- необходимо обозначить, какие действия с привелегиями (--rules) мы хотим выполнить. Здесь существуют варианты:
3.1. аргумент (--rules) не задан. Если запрос с указанным псевдонимом существует - скрипт исключает из привелегий выполнения запроса указанную группу, если таковая сущесвует
./webapp-db.py -a mywebapp add query newproject -g group1 --alias query1
3.2. аргумент привелегий задан, для указанного запроса привелегии заданной группы уже существуют. В этом случае привелегии группы обновляются.
./webapp-db.py -a mywebapp add query newproject -g group1 --alias query1 --rules 'count=1, timeout=2, record=3'
Внимание! Если указывать не все типы ограничений в привелегиях - остальные будут иметь нулевые значения (ограничения отсутсвуют)
3.3. аргумент привелегий задан, для указанного запроса привелегии заданной группы еще не существуют. В этом случае привелегии группы добавляются для запроса.
Получение информации о базе данных приложения
Зачастую, чтобы написать шаблон для очередного пользовательского запроса, нужно вспомнить какие проекты включает наше приложение, какие данные они хранят и в каком виде. Для быстрого получения этой информации в скрипте предусмотрен набор функций, которые вызываются через команду 'get'
Получить информацию о таблицах проекта
./webapp-db.py -a <app_name> <project_name> -p pr1 [-t <table_name>]
Команда возвращает набор строк со следующей иформацией:
- имя проекта,
- имя таблицы,
- имя поля,
- тип данных поля,
- значение поля по умолчанию
- допустимо ли пустое значение в поле
Команда работает в двух режимах. Если указать только имя проекта - вернет информацию о всех таблицах проекта, если дополнительно указать имя таблицы - информацию только о ней.
Шаблоны запросов
При добавлении запроса в проект, среди прочего мы задаем шаблон запроса. Шаблон пишется на языке sql и определяет результат с точностью до значений параметров. Значения задает пользователь при обращении к приложению. Соотвественно, в шаблоне должны быть предусмотрены переменные, в которые будут подставляться пользовательские значения.
Для написания шаблона запроса используется синтаксис форматированной строки python. Для того чтобы составить шаблон, достаточно следовать нескольким простым правилам (конечно, sql тоже нужно знать):
- Переменная, вместо которой будет подставлено пользовательское значение, имеет имя, которое заключается в фигурные скобки, например, '{name}'. Для вставки в шаблон самих фигурных скобок их нужно продублировать- '{{', '}}'.
- При указании переменной можно задать ее тип - '{name:type}'. В шаблоне допускаются следующие типы:
- s - строковый (по умолчанию, можно не указывать) или любой другой объект
- d, i - целое, длинное целое
- f - число с плавающей точкой
- Чтобы обернуть значение подставляемой переменной в одинарные кавычки (как это часто необходимо в sql-запросах), перменную нужно задать так '{name!r}'
Чтобы протестировать шаблон используем команду скрипта 'test'
./webapp-db.py -a mywebapp test 'select * from config.{projects}' 'projects=project'
Оба аргумента после команды 'test' обязательны. Первый - шаблон запроса, второй - значения пользовательских параметров запроса, формат значений - 'key1=val1, key2=val2, ...'
Внимание! команда 'test' проверяет только корректность шаблона запроса (без учета ограничений прав его использования)
Пришло время создать новые проекты нашего приложения и наполнить их данными. Об этом читайте в третьей части статьи
Но сначала рекомендуем ознакомиться с публикацией, посвященной извлечению данных из интернет-источников