Как определить пользовательский фильтр и привязать его к конечной точке ресурса

Я использую Python EVE, EVE-SQLAlchemy, Flask, Flask-SQLAlchemy, SQLAlchemy и базу данных Postgres.

У меня все конечные точки API настроены, и они работают нормально.

Теперь я пытаюсь отфильтровать элементы, возвращаемые ресурсом some_model, чтобы он возвращал только элементы (GET), которые принадлежат определенному пользователю (пользователь, выполняющий запрос API) или имеют определенное имя ( префикс). Код SQlAlcehmy для выполнения этого приведен ниже:

session.query(SomeModel).filter(or_(SomeModel.name.like('SOMETHING_%'), SomeModel.account_id==1)).all()

Я просмотрел хуки до и после запроса, доступ к ресурсам, ограниченный пользователем, и все остальное, что я мог найти, но нигде не описывается, как применять настраиваемые фильтры ко (всем) запросам GET определенной конечной точки/ресурса.

Похоже на функциональность фильтра URL, но всегда включена и фильтруется на уровне базы данных, а не на уровне сериализации/ответа.


person Metalstorm    schedule 25.12.2015    source источник


Ответы (2)


Если я правильно понял, выглядит как фильтр динамического поиска внутри Перехват событий предварительного запроса будет работать для ваших нужд фильтрации.

person gcw    schedule 28.12.2015
comment
Удалось ли вам вызвать обработчик событий непосредственно перед вызовами SomeModel GET? Если это так, вам просто нужно изменить фильтр поиска (я не знаю, как устроен синтаксис EVE-SQLAlchemy). У меня нет среды для тестирования EVE-SQLAlchemy, поэтому мой пример будет использовать стандартный поиск монго. Я могу опубликовать рабочий код для MongoDB, если это поможет. - person gcw; 29.12.2015
comment
У меня да, но нет доступа к объекту запроса sql alchemy. Я тоже не могу разобраться с фильтрами sqlalchemy. В настоящее время я добавил еще один хук в качестве хука pre_query, который выставляет курсор и, следовательно, объект запроса, который вы затем можете изменить. Кажется, работает хорошо, но было бы неплохо использовать «правильный» или поддерживаемый метод. - person Metalstorm; 29.12.2015

Я не знаю точного синтаксиса для запроса like, но or можно сделать так: (я проверял, работает)

def pre_GET(resource, request, lookup):
    # only return documents for account_id 1 or where name is metalstorm
    lookup['or_'] = [{'account_id': 1}, {'name': 'metalstorm'}]

Для запроса like посмотрите, помогает ли это.

person Mandar Vaze    schedule 05.02.2016