API документация¶
Настройка прав доступа по URL¶
- Следует различать несколько видов URL, отличающихся доступностью:
открытый - URL доступный всем без авторизации;
закрытый - URL доступный только авторизованным пользователям;
ограниченный - URL доступный только авторизованным пользователям, с определенными ролями.
Для создания URL с закрытым вариантом доступа требуется указать специальный декоратор перед определением обработчика URL.
Специальный декоратор можно получить с помощью функции get_auth_decorator из API приложения (модуль app_api в корне приложения).
Пример кода обработчика URL:
_auth_decorator = app_api.get_auth_decorator()
@mod.route('/test/handler', methods=['GET'])
@_auth_decorator
def test_handler():
"""
Тело обработчика
"""
return ''
Для создания URL с ограниченным вариантом доступа помимо использования специального декоратора, как в закрытом варианте, требуется указать роль(роли) для которых будет доступен данный URL.
Указать перечень ролей для доступа к определенному URL возможно только в dublin.ttl с помощью отношения splm:isAvailableFor, например:
splm:mod_url splm:isAvailableFor “role”.
где splm:mod_url - URL модуля для которого требуется предоставить для определенной роли, а “role” наименование роли которой требуется предоставить доступ (возможность получить ответ от сервера по указанному URL).
Для предоставления доступа к URL больше чем одной роли требуется повторить запись по количеству ролей в dublin.ttl.
Важно! При отрисовке страницы вывод элементов навигации учитывает роли, указанные для URL и отображает только те элементы, которые доступны текущему пользователю на основании ролей.
Осторожно
Проверка на соответствие ролей для URL с ролями назначенными текущему пользователю находится в зоне ответственности разработчика обработчика URL.
Пример кода проверки ролей текущего пользователя:
if g.user:
if g.user.has_role('role'):
Событийная модель в SPLM¶
SPLM поддерживает функционал регистрации и обработки событий - EventManager.
-
class
app.utilites.event_manager.EventManager[исходный код]¶ Базовые классы:
objectКласс реализует событийную модель
-
check_event_name(event_name)[исходный код]¶ Метод проверяет что в event_name есть только символы A-Za-z0-9_
- Параметры
event_name (str) – имя события
- Результат
True/False
- Тип результата
bool
-
define_thread(event_start, event_complete, handler)[исходный код]¶ Метод создает процесс с обработчиком и запускает его
- Параметры
event_start (threading.Event) – событие начала работы обработчика handler
event_complete (threading.Event) – событие окончания работы обработчика handler
handler (def) – функция-обработчик события event
-
get_event(event_name)[исходный код]¶ Метод возвращает экземпляр события event, зарегистрированного под именем event_name
- Параметры
event_name (str) – имя события
- Результат
event_start, event_complete - события начала и окончания работы обработчика
- Тип результата
threading.Event
-
raise_event(event_name, params={})[исходный код]¶ Метод вызывает событие, зарегистрированное под именем event_name
- Параметры
event_name (str) – имя события
params (dict) – параметры для функции-обработчика
- Результат
params
- Тип результата
dict
-
register_event(event_name, handler)[исходный код]¶ Метод регистрирует событие с именем event_name и функцией-обработчиком handler
- Параметры
event_name (str) – имя события
handler (def) – функция-обработчик события event_start
-
- Для регистрирации события необходимо задать параметры:
event_name- название событияhandler- функцию-обработчик, которая будет вызвана при отработке события
- Функция-обработчик принимает два аргумента:
event- экземпляр событияdata- данные, переданные обработчику в момент возникновения события.
и возвращает переменную data в том же виде, в котором она была получена.
- Для отработки события передать параметры:
event_name- название событияdata- данные, которые будут переданы обработчику
Все очень просто!
Пример:¶
Для начала зарегистрируем наше событие с именем "event_test" и обработчиком event_test_hadler()
Получаем экземпляр EventManager:
from app.app_api import get_event_manager
event_manager = get_event_manager()
Описываем обработчик и регистрируем событие:
def event_test_hadler(event, data):
....
return data
event_manager.register_event("event_test", event_test_hadler)
С этого момента будет запущен процесс, который слушает наше событие.
В случае регистрации нескольких обработчиков на одно событие они будут выполняться последовательно в том порядке, в котором были зарегистрированы. Результат предыдущего обработчика передается на вход следующему.
При возникновении ошибки (ошибка исполнения кода) при выполнении обработчика цепочка выполнения не прерывается. Входные данные для обработчика с ошибкой (ошибка исполнения кода) передаются следующему в очереди обработчику.
Теперь, чтобы наше событие "event_test" отработало, вызовем его, передав параметры params для функции-обработчика event_test_hadler().
Здесь data - это результат работы обработчика:
data = event_manager.raise_event("event_test", params)
Все. Теперь при отработке метода raise_event возникнет событие "event_test" и будет вызвана функция-обработчик event_test_hadler().