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().