Как сделать пользовательскую вставку внутри приложения python-eve

У меня есть несколько пользовательских методов flask в приложении eve, которым необходимо взаимодействовать с устройством telnet и возвращать результат, но я также хочу предварительно заполнить данные в некоторые ресурсы после получения данных с этого устройства telnet, например:

@app.route("/get_vlan_description", methods=['POST'])
def get_vlan_description():
    switch = prepare_switch(request)
    result = dispatch_switch_command(switch, 'get_vlan_description')

    # TODO: populate vlans resource with result data and return status

Мой settings.py выглядит так:

SERVER_NAME = '127.0.0.1:5000'
DOMAIN = {
    'vlans': {
        'id': {
            'type': 'integer',
            'required': True,
            'unique': True
        },
        'subnet': {
            'type': 'string',
            'required': True
        },
        'description': {
            'type': 'boolean',
            'default': False
        }
    }
}

У меня возникли проблемы с поиском документов или исходного кода для прямого доступа к ресурсу монго и вставки этих данных.


person cayblood    schedule 18.02.2014    source источник


Ответы (2)


Вы изучили хук on_insert? Из документации:

Когда документы должны быть сохранены в базе данных, возникают события on_insert(resource, documents) и on_insert_<resource>(documents). Функции обратного вызова могут подключаться к этим событиям для произвольного добавления новых полей или редактирования существующих. on_insert возникает при каждом обновлении ресурса, а on_insert_<resource> возникает, когда конечная точка <resource> получает запрос POST. В обоих случаях событие будет вызвано только в том случае, если хотя бы один документ прошел проверку и будет вставлен. documents представляет собой список и содержит только документы, готовые к вставке (документы полезной нагрузки, не прошедшие проверку, не включаются).

Итак, если я получу то, чего вы хотите достичь, у вас может быть что-то вроде этого:

def telnet_service(resource, documents):
    """ 
        fetch data from telnet device;
        update 'documents' accordingly 
    """
    pass

app = Eve()
app.on_insert += telnet_service

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

Обратите внимание, что таким образом вам не нужно возиться с базой данных напрямую, так как Ева позаботится об этом.

Если вы не хотите сохранять данные telnet, а только отправляете их обратно вместе с извлеченными документами, вы можете подключиться к on_fetch вместо этого.

Наконец, если вы действительно хотите использовать уровень данных, вы можете использовать app.data.driverкак показано в этом фрагменте примера< /а>.

person Nicola Iarocci    schedule 19.02.2014
comment
Спасибо! Можно ли изменить, в какой ресурс записывается, или записывать в несколько ресурсов во время одного и того же хука? - person cayblood; 19.02.2014
comment
Неа. Если, я думаю, вы не прибегаете к прямому использованию драйвера данных. - person Nicola Iarocci; 19.02.2014
comment
Можно ли удаленно использовать test_client для достижения того, о чем просит @CarlYoungblood, для работы с другими ресурсами? - person ArnauOrriols; 30.05.2014
comment
Вероятно, вы могли бы просто перейти к другим конечным точкам ресурсов из своей функции обратного вызова, используя запросы или что-то в этом роде. - person Nicola Iarocci; 30.05.2014

используйте post_internal

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

from run import app
from eve.methods.post import post_internal

payload = {
    "firstname": "Ray",
    "lastname": "LaMontagne",
    "role": ["contributor"]
}

with app.test_request_context():
    x = post_internal('people', payload)
    print(x)
person Amonsat    schedule 24.05.2018