如果我理解正确,这应该是您正在寻找的内容:
from oauth2client.client import OAuth2WebServerFlow
from oauth2client.tools import run_flow
from oauth2client.file import Storage
import requests
import os
CLIENT_ID = '9453asfasfaksdfh860b1osoiveogstt.apps.googleusercontent.com'
CLIENT_SECRET = '6gRid8wF7TW8asdfasdftX'
def get_new_token():
flow = OAuth2WebServerFlow(client_id=CLIENT_ID,
client_secret=CLIENT_SECRET,
scope='https://www.googleapis.com/auth/admin.directory.user https://www.googleapis.com/auth/admin.directory.user.readonly',
redirect_uri='http://example.com/auth_return')
storage = Storage('creds.data') #token details stored here
credentials = run_flow(flow, storage)
tokenhere=credentials.access_token #tokens generated
return tokenhere
def retrieve_saved_token():
if os.path.exists('creds.data'):
with open('creds.data') as creds:
tokenhere = creds.read() # Change to reflect how the token data is reflected in your 'creds.data' file
return tokenhere
def request_page(tokenhere):
r = requests.get("https://www.googleapis.com/admin/directory/v1/users?domain=mydomain.com",
headers={'Authorization': 'Bearer {token}'.format(token=tokenhere)})
result = r.json()
try:
tokenhere = retrieve_saved_token()
request_page(tokenhere)
except:
tokenhere = get_new_token()
request_page(tokenhere)
这里分解的是所做的所有组件
为了更加面向对象,我将您的逻辑移到了函数中:
def get_new_token():
flow = OAuth2WebServerFlow(client_id=CLIENT_ID,
client_secret=CLIENT_SECRET,
scope='https://www.googleapis.com/auth/admin.directory.user https://www.googleapis.com/auth/admin.directory.user.readonly',
redirect_uri='http://example.com/auth_return')
storage = Storage('creds.data') #token details stored here
credentials = run_flow(flow, storage)
tokenhere=credentials.access_token #tokens generated
return tokenhere
def request_page(tokenhere):
r = requests.get("https://www.googleapis.com/admin/directory/v1/users?domain=mydomain.com",
headers={'Authorization': 'Bearer {token}'.format(token=tokenhere)})
result = r.json()
如果令牌文件存在,我还添加了一个新函数来检索保存的令牌:
def retrieve_saved_token():
if os.path.exists('creds.data'):
with open('creds.data') as creds:
tokenhere = creds.read() # Change to reflect how the token data is reflected in your 'creds.data' file
return tokenhere
最后我们到了逻辑实际运行的部分。
首先,它尝试从文件中检索令牌,如果文件不存在,则会引发异常,您将进入异常逻辑。如果成功检索令牌,try 逻辑的编写方式也将捕获,但如果该令牌已过期,则请求逻辑应引发异常。
在异常逻辑中,它执行获取新令牌并使用该令牌请求页面的原始逻辑
try:
tokenhere = retrieve_saved_token()
request_page(tokenhere)
except:
tokenhere = get_new_token()
request_page(tokenhere)
编辑 1
我假设您不仅要请求页面,还要操作页面上的数据。为此,您将拥有另一个功能,该功能通过在您创建的 json 对象“结果”中查找标签来从页面中提取数据。我在下面的代码中将此函数称为“do_something_with_request_function()”。
第一个 Try/Except 将检查令牌文件是否存在,如果存在则获取该令牌并使用它,如果不存在则生成一个新令牌。
第二次尝试 except 有机会传入过期的令牌。所以让我们假设两种情况。
场景一:你传入一个有效的token,你在请求中得到了你需要的页面。您用于解析页面上数据的方法将查找该页面上存在的特定字段,一切正常。
场景 2:你传递了一个无效的令牌,你得到一个过期/无效令牌的错误页面。如果您将该页面解析为 json 并尝试操作数据的方法未找到您尝试访问的实际页面上通常存在的值,则会引发错误。这将强制代码跳转到 except 块。
except 块生成一个新令牌,将其传入以再次请求页面,并将正确处理您的数据。
try:
tokenhere = retrieve_saved_token()
except:
tokenhere = get_new_token()
try:
request_page(tokenhere)
do_something_with_request_function(result)
except:
tokenhere = get_new_token()
request_page(tokenhere)
do_something_with_request_function(result)