如何使用Python限制API端点中字符串值的数量?

jjhzyzn0  于 2023-05-30  发布在  Python
关注(0)|答案(2)|浏览(223)
  • 在这里,在代码中。在下面的API中,我一次最多只能使用5个值(API限制)。*
import requests
import json
import datetime
from datetime import date, datetime
import itertools
from sentimeterdb import dbconnect

from dotenv import load_dotenv   #for python-dotenv method
load_dotenv()                    #for python-dotenv method

import os

#Connection string pointing to the PROD db.
dbclient = dbconnect.process()
db = dbclient.abc
co_open = db.open_ab

myquery = {"bugs" : {"$ne" : {}, "$exists": True}}
mydoc = co_open.find(myquery)

lst = []
for x in mydoc:
    y = x.get('bugs')
    id_list = lst.append([*y.values()])
    cdets = list(itertools.chain(*lst))

cdets_split = cdets
string_cdets = ','.join(cdets_split[:5])

Access_URL = 'https://generating-token-from--here/oauth2/default/v1/token'

client_id = os.environ.get('CLIENT_ID')
client_secret = os.environ.get('CLIENT_SECRET')
grant_type = os.environ.get('GRANT_TYPE')
BASE_URL = f'https://google.com/{string_cdets}'

response = requests.post(Access_URL,
                     data={'grant_type': grant_type, 'client_id': client_id, 'client_secret': client_secret, 'content-type': 'application/x-www-form-urlencoded'})
json_response = response.json()

tokenvalue = (json_response['access_token'])

headers = {'Authorization': 'Bearer ' +
       tokenvalue, 'Content-Type': 'application/json'}

auth_response = requests.get(BASE_URL,  headers=headers)
auth_response_json = auth_response.json()

severity_list = []
for severity_5 in auth_response_json['bugs']:
    severity_list.append([severity_5['severity']])

print ("Severity ==> ", severity_list)

应提供所有CDET的严重度和状态。目前,它只提供5个项目。我怎样才能得到所有CDET的回复?

oiopk7p5

oiopk7p51#

我不确定我是否理解了这个问题,但是使用生成器根本不会影响复杂性。一个for循环是非常好的。
如果值('ABC'、'DEF'等)是动态生成的,则生成器将是有用的。在这种情况下,您可以使用for循环在生成器上循环。

qq24tv8q

qq24tv8q2#

itertools文档中有一个名为batched的函数的配方,该函数可用于从可迭代对象生成任意大小的“块”。

from itertools import islice 

def batched(iterable, n):
    "Batch data into tuples of length n. The last batch may be shorter."
    # batched('ABCDEFG', 3) --> ABC DEF G
    if n < 1:
        raise ValueError('n must be at least one')
    it = iter(iterable)
    while batch := tuple(islice(it, n)):
        yield batch

answer given here也可能有用。
无论如何,正如您已经猜到的,您最终将把这些块传递到for循环中,以进行API调用。

for group in batched(values, 5):
    ...  # insert API call here

我不确定是否有一种方法可以在不调用多个API的情况下做到这一点。采用这种分块列表的方法本质上意味着您将不得不进行调用,直到您的列表耗尽。

**编辑:**以下来自OP的更新

如果更改的是BASE_URL的值,则只需从cdets循环“批处理”,根据需要更新BASE_URL并将其传递给requests.get(BASE_URL, headers=headers)

auth_responses = []  # init an empty list to store responses

for batch in batched(cdets, 5):
    string_cdets = ','.join(batch)
    BASE_URL = f'https://google.com/{string_cdets}'
    # append responses to the list
    auth_responses.extend(requests.get(BASE_URL, headers=headers))
  • 警告 * -这里做了一些猜测,因为我们不知道这些CDET是什么...

另外,BASE_URL实际上应该样式为base_url,因为它是一个值会改变的变量-所有大写通常用于暗示CONSTANT值,而BASE_URL绝对不是

相关问题