首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我收到来自外部API的400响应时,我应该抛出哪个异常?

当我收到来自外部API的400响应时,我应该抛出哪个异常?
EN

Stack Overflow用户
提问于 2021-02-27 02:54:44
回答 1查看 17关注 0票数 0

我正在编写一个与第三方API集成的简单Django应用程序。它从第三方获取一些JSON并将其显示在一个基本的web应用程序中。我正在使用OAuth2授权代码流向身份验证服务器进行身份验证。

与外部API的任何直接通信都发生在与我的视图分离的函数中-因此没有任何视图直接调用API。相反,它们将根据需要导入和调用这些“服务”函数。

作为授权代码流的一部分,我需要使用刷新令牌来获取新的访问令牌,以便继续从第三方获取资源。下面是刷新访问令牌的函数:

代码语言:javascript
运行
复制
import requests
import environ

### Globals
env = environ.Env()
AUTH_URL = 'https://example.com/oauth/access_token.php'
CLIENT_ID = env('CLIENT_ID')
CLIENT_SECRET = env('CLIENT_SECRET')

...

def refresh_access_token(refresh_token):
    """
    uses refresh_token to request another access token
    returns the access token
    """
    payload = {
        'refresh_token': refresh_token,
        'client_id': CLIENT_ID,
        'client_secret': CLIENT_SECRET,
        'grant_type': 'refresh_token',
    }

    response = requests.request('POST', AUTH_URL, data=payload)

    return response.json()['access_token']

这是我的问题-如果我想得太多了,请原谅-但假设我的刷新令牌已被用户撤销。我将从服务器获取一个400 Bad Request状态代码。因此,为了处理这个问题,我需要将上面的返回行更改为这样:

代码语言:javascript
运行
复制
if response.status_code == 400:
    # throw an exception
else:
   return response.json()['access_token']

抛出的最干净、最pythonic的异常是什么?我应该在“非”-Django代码中(即不直接在视图中)抛出特定于Django的异常吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-27 03:10:53

我最终只是用自己的子类化了Exception,并捕捉到了这一点。

代码语言:javascript
运行
复制
class InvalidGrant(Exception):
    pass

...

    if response.status_code == 400:
        raise InvalidGrant('Your refresh token is invalid.')
    return response.json()['access_token']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66391331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档