python - 使用令牌身份验证发送多个请求?
问题描述
目前我的 API 需要使用令牌认证。
POST /api/authorize HTTP/1.1
"version": "20151130", // The version of the REST API you are using
"client_id": "01234567890123456789", // Your 20 char public client id
"client_secret": "0123456789..." // Your 40 char client secret
我得到回应:
{
"auth_token": "abcdef...",
"auth_expires": "20180524T062442Z"
}
我目前的模式是这样的:
我有一个items
需要通过 POST 方法传递给 API 的列表。这是我的主要功能:ProcessProducts
它接收一个 Pandas Dataframe,其中每行包含一个产品。
def ProcessProducts(products):
all_results = []
for _, product in products.iterrows():
results = GetProductData(product)
if results:
all_results.extend(results)
return all_results
def GetAuthorizationToken():
payload = {
'version': api_version,
'client_id': api_client_id,
'client_secret': api_client_secret
}
request_url = '%s%s' % (api_host, '/api/authorize')
r = requests.post(request_url, data=payload)
if r.status_code != 200:
raise Exception('Failed to authorize: ' + r.text)
token_data = json.loads(r.text)
api_auth_token = token_data['auth_token']
api_auth_expires = token_data['auth_expires']
return {
"X-API-Version": api_version,
"Authorization": "token %s" % api_auth_token
}
客户端功能...
def GetProductData(self, product):
"""Gets Product information from API."""
url = '%s%s' % (self.api_url, _COMPANY_DATA)
request = json.dumps({'products': [product]})
form_data = {'request': request, 'start': 1, 'limit': 1000}
logging.info('Looking up: %s', url)
auth_headers = GetAuthorizationToken()
response = _SendApiRequest(url, auth_headers, form_data)
return _HandleResponse(response)
def _SendApiRequest(self, url, auth_headers, form_data):
session = requests.Session()
try:
response = session.post(
url,
timeout=(_CONNECT_TIMEOUT_SECONDS, _READ_TIMEOUT_SECONDS),
headers=auth_headers,
data=form_data,
verify=True) # Check for valid public/signed HTTPS certificate.
response.raise_for_status()
return response
except requests.exceptions.HTTPError as err:
logging.exception(err)
问题:
API返回代码过期字段“auth_expires”,当令牌过期时,哪里可能是签入代码的最佳方式,以便我可以请求一个新的?
是否有更好的模式来调用 API,所以我也可以控制 QPS 速率(使用 RateLimiter)。现在我正在为每个请求创建一个会话,这可能并不理想。
解决方案
推荐阅读
- powershell - 自动将 PowerBI 报告上传到工作区列表的 PowerShell 脚本
- chisel - 凿子:在最终的 Verilog 中获取信号名称
- javascript - Rails:如果表单返回验证错误,则保持 JSON 表单字段填充
- macos - 如何为 MS Word for Mac 创建可安装包?
- elasticsearch - 如何根据日期字段从 Elasticsearch 获取最新数据
- thymeleaf - thymeleaf 片段是否需要存在于格式良好的 HTML 文件中?
- spring-boot - 如何将 GlobalMethodSecurityConfiguration 迁移到 Reactive Spring?
- python - 获取布尔值数组的问题
- python - 有没有办法在命名新创建的文件时使用导入文件的名称?
- c++ - 如何在 QT 中使用 libraw?