如何在使用 oauthlib.oauth2 fetch_token 时捕获 API 失败

Posted

技术标签:

【中文标题】如何在使用 oauthlib.oauth2 fetch_token 时捕获 API 失败【英文标题】:How to capture API failure while using oauthlib.oauth2 fetch_token 【发布时间】:2018-07-06 10:32:08 【问题描述】:

此库中的 Python3 fetch_token 方法在使用响应之前不会检查响应状态。如果它发出的 API 调用失败,那么响应将无效并且脚本崩溃。有什么我可以设置的,以便在库可以读取响应之前对不成功的响应引发异常?

import requests
from requests.auth import HTTPBasicAuth
from requests_oauthlib import OAuth2Session
from oauthlib.oauth2 import BackendApplicationClient
from oauthlib.oauth2 import OAuth2Error

AUTH_TOKEN_URL = "https://httpstat.us/500"  # For testing
AUTH = HTTPBasicAuth("anID", "aSecret")
CLIENT = BackendApplicationClient(client_id="anID")
SCOPES = "retailer.orders.write"
MAX_API_RETRIES = 4

class MyApp:
    def __init__(self):
        """Initialize ... and obtain initial auth token for request"""
        self.client = OAuth2Session(client=CLIENT)
        self.client.headers.update(
            
                "Content-Type": "application/json"
            
        )

        self.__authenticate()

    def __authenticate(self):
        """Obtain auth token."""
        server_errors = 0

        # This needs more work. fetch_token is not raising errors but failing
        # instead.
        while True:
            try:
                self.token = self.client.fetch_token(
                    token_url=AUTH_TOKEN_URL, auth=AUTH, scope=SCOPES
                )
                break

            except (OAuth2Error, requests.exceptions.RequestException) as e:
                server_errors = MyApp.__process_retry(
                    server_errors, e, None, MAX_API_RETRIES
                )

    @staticmethod
    def __process_retry(errors, exception, resp, max_retries):
        # Log and process retries
        # ...

        return errors + 1

MyApp()  # Try it out

【问题讨论】:

【参考方案1】:

您可以添加一个“合规挂钩”,在库尝试解析它之前,它将从请求中传递 Response 对象,如下所示:

def raise_on_error(response):
    response.raise_for_status()
    return response

self.client.register_compliance_hook('access_token_response', raise_on_error)

根据您可能遇到错误的确切时间,您可能还希望使用'refresh_token_response' 和/或'protected_request' 来执行此操作。请参阅docstring for the register_compliance_hook method 了解更多信息。

【讨论】:

只要改动一下,效果就很好! raise_on_error 必须返回响应对象。 不完全。 return response 需要在下一行,否则返回快乐路径 None 啊,再次感谢!我没有花时间实际测试最后一次编辑^_^

以上是关于如何在使用 oauthlib.oauth2 fetch_token 时捕获 API 失败的主要内容,如果未能解决你的问题,请参考以下文章

稳压电源元件使用功率FET应注意的问题

基于FET3568-C核心板实现的智能网关

飞凌嵌入式FET1052-C解决方案 扫描枪方案

LPC2134单片机解密型号

基于FET3399-C嵌入式核心板的PCR解决方案

基于FET335XD核心板在全自动血液分析仪系统的应用方案