Запрашивать `_items` только с использованием API python-eve для MongoDB

Я использую python-eve-API (сокращенно eve) для доступа к MongoDB. После вставки некоторых примеров данных я использую Chrome Postman для тестирования API.

Поскольку eve предоставляет дополнительную информацию помимо запрошенных данных и директив HATEOAS, как описано в docs Мне просто интересно, как запросить только _items-словарь (назовите его dictionary, если говорить с точки зрения Python, и object, если говоря в терминах JSON или JavaScript).

Таким образом, пример запроса http://127.0.0.1:5000/packagings/ дает показанный ниже ответ, из которого меня интересуют только данные, содержащиеся в _items-словаре/-объекте.

Конечно, я могу извлечь нужные данные после получения и сохранения полного ответа. Однако есть ли способ запрашивать только те данные, которые меня интересуют, чтобы уменьшить дополнительное извлечение данных, соответственно. обработка данных после их получения?

{
    "_links": {
        "self": {
            "href": "packagings",
            "title": "packagings"
        },
        "parent": {
            "href": "/",
            "title": "home"
        }
    },
    "_meta": {
        "max_results": 25,
        "page": 1,
        "total": 1
    },
    "_items": [
        {
            "diameter_dk": 0.0144,
            "_created": "Tue, 17 Nov 2015 21:15:37 GMT",
            "factor_fa": 2.1,
            "_id": "564b98f955c40f29843128df",
            "free_volume": 0.89,
            "title": "raschigring10x10x0.5",
            "_updated": "Tue, 17 Nov 2015 21:15:37 GMT",
            "_links": {
                "self": {
                    "href": "packagings/564b98f955c40f29843128df",
                    "title": "Packaging"
                }
            },
            "specific_weight": 920,
            "title_hr": "Raschig-Ring 10x10x0.5",
            "specific_surface": 500,
            "specific_number": 770000,
            "_etag": "bcb4080b61028405babcd960196d27208c3eabd3"
        }
    ]
}

person albert    schedule 17.11.2015    source источник


Ответы (1)


Вы можете отключить HATEOAS, установив HATEOAS = False в настройках конфигурации. Это должно значительно уменьшить полезную нагрузку, сделав ее более подходящей для вашего варианта использования.

EDIT: вы также можете преобразовать полезную нагрузку ответа, подключив функцию обратного вызова к событию on_fetched_resource.

from eve import Eve

def on_fetched_resource(resource, response):
    del(response['_links'])
    del(response['_meta'])

    # would result in an empty JSON document
    # del(response['_items'])

app = Eve()
app.on_fetched_resource += on_fetched_resource

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

Поскольку ответ представляет собой dict (в конце концов, это JSON), вам все равно нужно будет предоставить ключ для массива документов.

person Nicola Iarocci    schedule 19.11.2015
comment
Как вы сказали, это значительно снижает полезную нагрузку, не помещая объект _links в массив. Однако нет ли способа просто получить желаемый объект данных? - person albert; 20.11.2015
comment
Отредактировано после вашего комментария - person Nicola Iarocci; 20.11.2015
comment
@NicolaIarocci, как показать только объект _items? например, если я хочу показать объект людей прямо из mongodb [{'firstname':'Sunny','lastname':'hashmi'}]. Также без ключа _items. - person AHashmi; 02.02.2016
comment
@AHashmi, это потребует нового вопроса. В любом случае: если вы отключите HATEOAS, вы получите только список документов с ответом. - person Nicola Iarocci; 02.02.2016
comment
@NicolaIarocci Отключение HATEOS не отвечает массивом, я создал новый вопрос stackoverflow.com/questions/35160423/ - person AHashmi; 15.02.2016
comment
Правильно, отключение HATEOAS будет работать для конечных точек документа, а не для конечной точки ресурса. - person Nicola Iarocci; 16.02.2016
comment
@NicolaIarocci, как мы можем on_fetched_resource на уровне документа? Я пытался: def on_fetched_resource(item, response): del(response['_items']) но не повезло! PS: у меня уже есть 'hateoas' : False - person haytham; 10.05.2019
comment
@haytham у вас есть документы в response['_items']. Вы можете просмотреть их for doc in response['_items'] и делать с ними все, что захотите. Например, я хотел удалить из них поля _id и не мог сделать это с projection:{_id:0}, поэтому я просто удалил так, по одному (их все равно всего несколько на запрос) - person Brandt; 16.07.2019