我有一个 python 代码来调用图形 api 并浏览共享点上的目录。该目录有 120gb 的文件,需要数小时才能扫描。但是,我观察到该脚本仅显示为在 visual studio 代码上运行,并且没有进一步执行。我在循环中打印文件名,一小时后它停止输入文件名。
是否是因为 token 一小时后就过期了?如果是,为什么我没有收到指示令牌无效的错误?
# Define imports
import requests
# Copy access_token and specify the MS Graph API endpoint you want to call, e.g. 'https://graph.microsoft.com/v1.0/groups' to get all groups in your organization
#access_token = '{ACCESS TOKEN YOU ACQUIRED PREVIOUSLY}'
url = "[URL TO THE SHAREPOINT]"
headers = {
'Authorization': access_token
}
consentfilecount=0
clientreportcount = 0
graphlinkcount = 0
while True:#
#print(graph_result.json()['@odata.nextLink'])
graph_result = requests.get(url=url, headers=headers)
if ('value' in graph_result.json()):
for list in graph_result.json()['value']:
if(("Client Consent Form").lower() in list["name"].lower()):
consentfilecount +=1
print(list["name"])
if(("Final Client Report").lower() in list["name"].lower()):
clientreportcount +=1
print(list["name"])
#print(graph_result.json())
if('@odata.nextLink' in graph_result.json()):
url = graph_result.json()['@odata.nextLink']
graphlinkcount += 1
else:
break
print(consentfilecount)
正确答案
您所描述的行为几乎可以肯定是由于您似乎使用的不记名令牌确实仅在一个小时左右有效。
默认情况下,requests
does not raise exceptions based solely on HTTP status codes 允许开发人员选择他们想要如何处理此类情况。在您的情况下,您的 while true:
循环只是继续运行,成功解析从错误响应返回的 json 结构,但从未真正满足块内的任何条件。
如果您确实希望脚本在不成功的 http 响应代码上引发异常,您可以添加对 raise_for_status()
的调用:
graph_result = requests.get(url=url, headers=headers)
graph_result.raise_for_status()
但是,如果您的代码预计正常运行时间超过令牌的有效期,您可能应该在代码中使用正确的 oauth 刷新流程,以防止发生此类错误。