Настройка обработчиков Rest-сервиса

Материал из Course Orchestra
Перейти к: навигация, поиск

Основные принципы

Rest-сервис flute настраивается при помощи декораторов @Mapping, @FilterBefore и @FilterAfter, объявленных над функцией-обработчиком или функцией-фильтром. Для их использования в Celesta-скрипте необходимо их импортировать из пакета ru.curs.flute.rest.decorator.

Например, так:

from ru.curs.flute.rest.decorator import Mapping
import json

@Mapping('/foo')
def foo(context, flute, request):
    dto = {
        "foo": 1,
        "bar": 2
    }
    return json.dumps(dto)

Для этого случая при http-запросе по адресу http://domain:<restport>/foo будет получен ответ:

{"foo":1, "bar":2}.

Параметр restport (номер порта) задается в конфигурационном файле flute.


Краткое описание декораторов

  1. @Mapping — определяет url для обработчика запроса.
  2. @FilterBefore — определяет url-pattern (или их группу) для фильтра, срабатывающего до того, как будет вызван обработчик запроса.
  3. @FilterAfter — определяет url-pattern (или их группу) для фильтра, срабатывающего после того, как будет вызван обработчик запроса.

Особенности функций-обработчиков и функций-фильтров

  1. Каждая функция принимает в качестве аргументов параметры context (контекст вызова для работы с Celesta) и request (олицетворяет объект http-запроса и является экземпляром класса Request)
  2. Данные между элементами цепочки фильтров и обработчика передаются через словарь request.attribute()
  3. Все фильтры получают Сelesta-контекст пользователя, указанного в конфигурационном файле Flute в параметре fluteuserid.
  4. По умолчанию обработчик запроса получает Celesta-контекст пользователя, указанного в параметре fluteuserid конфигурационного файла Flute. Если же в одном из before-фильтров в словарь request.attribute() был добавлен параметр userId, то обработчик получит Celesta-контекст пользователя с указанным userId.
  5. Цепочка фильтров и обработчика продолжается до тех пор, пока из фильтра или обработчика не будет возвращен результат (желательно строка, но возможно вернуть любой объект). Возвращенные ответ будет результирующим. Также имеется возможность вернуть ответ с указанным статусом при помощи следующего выражения:
...
from ru.curs.flute.rest import FluteResponse
...
@Mapping('/foo')
...
    return FluteResponse.status(401).text('Unauthorized')
выражения return FluteResponse.status(status).text(text)

Декоратор @Mapping

  1. Используется для того, чтобы связать url с обработчиком.
  2. В качестве аргументов принимает 3 строковых параметра: url, method ("GET" или "POST") и contentType.
  3. По умолчанию параметр method равен "GET".

Примеры использования:

from ru.curs.flute.rest.decorator import Mapping

# GET - запрос
@Mapping('/foo')
...

# GET - запрос
@Mapping('/foo', 'GET')
...

# POST - запрос, принимающий json тело
@Mapping('/foo', 'POST', 'application/json')
...


Декоратор @FilterBefore

  1. Используется для того, чтобы связать url-pattern (или группу url-patterns) с функцией-фильтром, которая будет вызвано до выполнения обработчика.
  2. В качестве аргументов принимает кортеж строковых параметров, задающих url-pattern.
  3. Применяются в порядке объявления в модуле.
  4. Перед обработчиком может выполняться любое количество фильтров.

Примеры использования:

from ru.curs.flute.rest.decorator import FilterBefore
# Before-фильтр на url '/foo'
@FilterBefore('/foo')
...

# Before-фильтр на url'ы, вида '/foo/{все_кроме_слэша}'
@FilterBefore('/foo/*')
...

# Before-фильтр на url'ы, вида '/foo/{все_кроме_слэша}', '/{все_кроме_слэша}/foo'
@FilterBefore('/foo/*', '/*/foo')
...


Декоратор @FilterAfter

  1. Используется для того, чтобы связать url-pattern (или группу url-patterns) с функцией-фильтром, которая будет вызвано после выполнения обработчика.
  2. В остальном работает как декоратор @FilterBefore.

Пример импорта:

from ru.curs.flute.rest.decorator import FilterAfter