我正在编写一个与第三方API集成的简单Django应用程序。它从第三方获取一些JSON并将其显示在一个基本的web应用程序中。我正在使用OAuth2授权代码流向身份验证服务器进行身份验证。
与外部API的任何直接通信都发生在与我的视图分离的函数中-因此没有任何视图直接调用API。相反,它们将根据需要导入和调用这些“服务”函数。
作为授权代码流的一部分,我需要使用刷新令牌来获取新的访问令牌,以便继续从第三方获取资源。下面是刷新访问令牌的函数:
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
状态代码。因此,为了处理这个问题,我需要将上面的返回行更改为这样:
if response.status_code == 400:
# throw an exception
else:
return response.json()['access_token']
抛出的最干净、最pythonic的异常是什么?我应该在“非”-Django代码中(即不直接在视图中)抛出特定于Django的异常吗?
发布于 2021-02-27 03:10:53
我最终只是用自己的子类化了Exception
,并捕捉到了这一点。
class InvalidGrant(Exception):
pass
...
if response.status_code == 400:
raise InvalidGrant('Your refresh token is invalid.')
return response.json()['access_token']
https://stackoverflow.com/questions/66391331
复制相似问题