如何使用 yield 进行分页?

时间:2021-06-17 21:41:58

标签: python rest

我正在尝试从使用分页的端点获取所有记录:

来自文档:

分页

除非另有说明,索引操作限制为每个请求 200 个资源。可以提供限制参数以减少请求返回的结果数量,并且可以提供偏移参数以跳过记录。分页的元数据在索引动作中返回,例如:

{
  data: { ... },
  meta: { paging: { previous: '', next: '' } },
}

上一个和下一个字段将分别是可用于检索上一页和下一页数据的 URL。如果没有上一页或下一页,则该字段将被省略。

所以我正在尝试:

from datetime import date, datetime, time, timedelta
import requests
import json

class Clio:
    API_BASE_URL = "eu.app.clio.com"
    CLIENT_ID = "aUX1h...MidAv"
    CLIENT_SECRET = "jGZZ...n49Ss"

    def __init__(self):
        self.session = requests.Session()
        self.auth()

    def refresh_token(self):
        # ...
        pass

    def get_matters(self):
        url = f"https://{Clio.API_BASE_URL}/api/v4/matters/"
        
        matters = self.fetch_data(url)
        yield matters

        while matters['meta']['paging']['next']:
            url = matters['meta']['paging']['next']
            matters = self.fetch_data(url)
            yield matters

        for matter in matters:
            print(matter['id'])

        return matters

    def fetch_data(self, url):
        response = self.session.get(url)

        return response.json()

    def auth(self):
        self.access_token = open("token.json", "r")
        self.access_token = json.load(self.access_token)
        
        if self.access_token.get("expires_at") < datetime.now().timestamp(): self.refresh_token()

        self.session.headers = {'Authorization': 'Bearer ' + self.access_token.get("access_token")}

目标是调整方法 get_matters()fetch_data() 以在我从另一个文件 example.py 调用它时返回所有事项:

from clio import Clio

clio = Clio()

matters = clio.get_matters()

# ...

我的班级 Clio 有什么问题?

1 个答案:

答案 0 :(得分:0)

正如@alani 和@MichaelButscher 提到的,删除 return matters 方法中的 get_matters

调用代码需要消耗生成器中的所有项目:

matters = list(clio.get_matters())