Я разрабатываю веб-API с 10 или около того таблицами в бэкэнде, с несколькими ассоциациями «один ко многим» и «многие ко многим». По сути, API - это оболочка базы данных, которая выполняет проверенные обновления и условные запросы. Он написан на Python, и я использую SQLAlchemy для ORM и CherryPy для обработки HTTP.
Пока что я разделил 30 запросов, которые API выполняет, на свои собственные функции, которые выглядят так:
# in module "services.inventory"
def find_inventories(session, user_id, *inventory_ids, **kwargs):
query = session.query(Inventory, Product)
query = query.filter_by(user_id=user_id, deleted=False)
...
return query.all()
def find_inventories_by(session, app_id, user_id, by_app_id, by_type, limit, page):
....
# in another service module
def remove_old_goodie(session, app_id, user_id):
try:
old = _current_goodie(session, app_id, user_id)
services.inventory._remove(session, app_id, user_id, [old.id])
except ServiceException, e:
# log it and do stuff
....
Обработчик запросов CherryPy вызывает методы запросов, которые при необходимости разбросаны по нескольким сервисным модулям. Обоснование этого решения заключается в том, что, поскольку им необходим доступ к нескольким классам моделей, они не принадлежат отдельным моделям, а также эти запросы к базе данных должны быть отделены от прямой обработки доступа к API.
Я понимаю, что приведенный выше код может называться Иностранные методы в сфере рефакторинга. Я вполне мог бы жить с этим способом организации на некоторое время, но, поскольку все начинает выглядеть немного грязно, я ищу способ реорганизовать этот код.
- Поскольку запросы напрямую связаны с API и его бизнес-логикой, их трудно обобщать, как геттеры и сеттеры.
- Пахнет повторять аргумент
session
таким образом, но, поскольку текущая реализация API создает новый экземпляр обработчика CherryPy для каждого вызова API и, следовательно, объект session
, не существует глобального способа добраться до ток session
.
Существует ли устоявшаяся схема организации таких запросов? Должен ли я придерживаться внешних методов и просто попытаться унифицировать сигнатуру функции (порядок аргументов, соглашения об именах и т. Д.)? Что бы вы предложили?