Переопределить конечную точку Python Eve из-за изменений внутреннего столбца? - PullRequest
0 голосов
/ 03 июня 2019

Как переопределить конечную точку, если я хочу выполнить некоторые преобразования данных, прежде чем они попадут в базу данных. Например, допустим, у нас была таблица people с именем столбца fname, и мы переименовали ее в first_name. Но наши пользователи делают запросы с fname. Есть ли способ переопределить конечную точку с помощью пользовательского маршрута для people, чтобы я мог преобразовать имя столбца из fname в first_name или более сложный, запустить некоторый код Python перед тем, как самому вызывать SQLALchemy или, возможно, возвращать его вернуться к Eve Framework для продолжения вызова базы данных?

например. используя QuickStart, я попробовал что-то вроде этого, но это не сработало:

from eve import Eve
from flask import jsonify

app = Eve()


@app.route('/people/<name>')
def custom_people_func(name):
    return jsonify(name='Override', people_name=name)


if __name__ == '__main__':
    app.run()

settings.py

people = {
    # 'title' tag used in item links. Defaults to the resource title minus
    # the final, plural 's' (works fine in most cases but not for 'people')
    'item_title': 'person',

    # by default the standard item entry point is defined as
    # '/people/<ObjectId>'. We leave it untouched, and we also enable an
    # additional read-only entry point. This way consumers can also perform
    # GET requests at '/people/<lastname>'.
    'additional_lookup': {
        'url': 'regex("[\w]+")',
        'field': 'lastname'
    },

    # We choose to override global cache-control directives for this resource.
    'cache_control': 'max-age=10,must-revalidate',
    'cache_expires': 10,

    # most global settings can be overridden at resource level
    'resource_methods': ['GET', 'POST'],

    'schema': schema
}
DOMAIN = {'people': people}

Когда я делаю curl -i http://127.0.0.1:5000/people/obama, он не будет вызывать метод, который я определил, а по умолчанию будет использовать Eve.

В общем, как нам управлять такими изменениями в базе данных, если это возможно, с помощью Eve?

1 Ответ

1 голос
/ 03 июня 2019

Вы изучили Хуки событий , в частности Хуки событий базы данных ? Они позволяют вам привязать функцию обратного вызова к вашим событиям в БД (вставить, заменить, удалить, извлечь.) В вашей функции вы можете, например, изменить входящую полезную нагрузку, прежде чем она попадет в базу данных.

>>> def before_insert(resource_name, items):
...  print('About to store items to "%s" ' % resource)
...  # modify incoming items here

>>> app = Eve()
>>> app.on_insert += before_insert
>>> app.run()
...