Как просматривать результаты с помощью оболочки Shopify Python API

avatar
rseabrook
15 августа 2019 в 02:39
2746
3
3

Я хочу просмотреть результаты Shopify API с помощью оболочки Python. API недавно (2019-07) переключился на «разбивку на страницы на основе курсора», поэтому я не могу просто передать параметр запроса «страница», чтобы получить следующий набор результатов.

В документах Shopify API есть страница, посвященная пагинации на основе курсора.

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

Думаю, я мог бы заставить это работать без использования оболочки API Python, но должен быть простой способ получить следующий набор результатов.

import shopify

shopify.ShopifyResource.set_site("https://example-store.myshopify.com/admin/api/2019-07")
shopify.ShopifyResource.set_user(API_KEY)
shopify.ShopifyResource.set_password(PASSWORD)

products = shopify.Product.find(limit=5)

# This works fine
for product in products:
    print(product.title)

# None of these work for accessing the headers referenced in the docs
print(products.headers)
print(products.link)
print(products['headers'])
print(products['link'])

# This throws an error saying that "page" is not an acceptable parameter
products = shopify.Product.find(limit=5, page=2)

Кто-нибудь может привести пример получения следующей страницы результатов с помощью оболочки?

Источник

Ответы (3)

avatar
rseabrook
23 июня 2021 в 15:04
4

Как упомянул @babis21, это была ошибка в обертке API-интерфейса shopify python. Библиотека была обновлена ​​в январе 2020 г., чтобы исправить это.

Для тех, кто наткнется на это, вот простой способ просмотреть все результаты. Этот же формат работает и для других объектов API, например для продуктов.

orders = shopify.Order.find(since_id=0, status='any', limit=250)
for order in orders:
    # Do something with the order
while orders.has_next_page():
    orders = orders.next_page()
    for order in orders:
        # Do something with the remaining orders

При использовании since_id=0 будут получены ВСЕ заказы, поскольку идентификаторы заказов гарантированно больше 0.

Если вы не хотите повторять код, обрабатывающий объекты заказов, вы можете обернуть все это в итератор следующим образом:

def iter_all_orders(status='any', limit=250):
    orders = shopify.Order.find(since_id=0, status=status, limit=limit)
    for order in orders:
        yield order
    
    while orders.has_next_page():
        orders = orders.next_page()
        for order in orders:
            yield order

for order in iter_all_orders():
    # Do something with each order

Если вы извлекаете большое количество заказов или других объектов (для автономного анализа, как я), вы обнаружите, что это медленно по сравнению с другими вашими вариантами. GraphQL API работает быстрее, чем REST API, но выполнение массовых операций с GraphQL API было наиболее эффективным.

avatar
babis21
23 октября 2019 в 11:12
0

@rseabrook

У меня точно такая же проблема, кажется, у других тоже, и кто-то поднял это:

где я вижу открытый PR для этого: https://github.com/Shopify/shopify_python_api/pull/338

Думаю, он должен быть готов в ближайшее время, поэтому в качестве альтернативы можно было бы немного подождать и использовать версию 2019-04 (которая поддерживает параметр страницы для разбиения на страницы).

ОБНОВЛЕНИЕ: кажется, это было выпущено сейчас: https://github.com/Shopify/shopify_python_api/pull/352

avatar
Kshitij Verma
3 сентября 2019 в 12:53
1

Вы можете найти заголовок ответа с кодом ниже

resp_header = shopify.ShopifyResource.connection.response.headers["link"];

затем вы можете разделить (',') строку индекса ссылки, а затем удалить (<>) и получить следующий URL-адрес ссылки.

Я не знаком с python, но думаю, что буду работать, вы также можете просмотреть ссылки ниже: https://community.shopify.com/c/Shopify-APIs-SDKs/Python-API-library-for-shopify/td-p/529523

https://community.shopify.com/c/Shopify-APIs-SDKs/Trouble-with-pagination-when-fetching-products-API-python/td-p/536910

спасибо