如何/我可以在条带 webhook 处理程序中调用 FASTAPI 异步函数,还是我的方法完全错误?
Posted
技术标签:
【中文标题】如何/我可以在条带 webhook 处理程序中调用 FASTAPI 异步函数,还是我的方法完全错误?【英文标题】:How/Can I call FASTAPI async function within a stripe webhook handler or is my approach completely wrong? 【发布时间】:2022-01-09 14:37:45 【问题描述】:从高层次上讲,我正在尝试实现条带 webhook,并且我想通过将数据库中的值更新为 true 来处理成功的事件。我采用的方法是创建一个名为 handle_verification
的异步函数,它获取当前登录用户并更新 id_verified 标志。
@app.get("/user")
async def get_current_user(authorize: AuthJWT = Depends()):
authorize.jwt_required()
id = authorize.get_jwt_subject()
return await User_Pydantic.from_queryset_single(UserModel.get(id=id))
@app.put('/user/verify')
async def handle_verification():
user = await get_current_user()
await UserModel.filter(id=user.id).update(id_verified = True)
我在这里尝试在 webhook 代码中调用这个函数
@app.post('/create-verification-session')
async def create_verification_session(request: Request):
verification_session = stripe.identity.VerificationSession.create(
type='document',
)
return verification_session.client_secret
@app.post('/verification-session-webhook')
async def webhook(request: Request ):
webhook_secret = os.getenv('STRIPE_WEBHOOK_SECRET')
data = await request.body()
print(data)
signature = request.headers.get('stripe-signature')
try:
event = stripe.Webhook.construct_event(
payload=data,
sig_header=signature,
secret=webhook_secret
)
event_data = event['data']['object']
except stripe.error.SignatureVerificationError as e:
print(str(e))
return 'error': str(e)
event_type = event['type']
if event_type == 'identity.verification_session.created':
print("Started verification")
print(event_data.url)
if event_type == 'identity.verification_session.verified':
print("All the verification checks passed")
await handle_verification()
return 'status': "success"
我得到了错误
AttributeError: 'Depends' object has no attribute 'jwt_required
我知道这个错误来自get_current_user()
,因为异步顺序搞砸了。我尝试将 handle_verification
放入使用 asyncio.run() 的同步包装函数中,但没有成功。
我尝试了各种不同的修复尝试,我认为核心问题是我仍在学习异步和 webhook 以及所有爵士乐,所以我完全被难住了。我将不胜感激对我解决此问题的方法的任何帮助,以及对可能比我现在所拥有的更容易的不同方法的任何见解。提前谢谢大家!
【问题讨论】:
【参考方案1】:我对 FastAPI 和 FastAPI JWT Auth 不太熟悉,但我会尽力提供帮助。
我查看了FastAPI JWT Auth 示例,在我看来,您想从get_current_user()
函数中删除async
说明符。我发现的所有示例都确保这部分代码是同步的。希望这就是确保您不调用.jwt_required()
之前您的authorize
对象被正确实例化所需要的全部内容。
【讨论】:
嗨,刚刚尝试了这种方法,我又遇到了另一个错误。ValueError: [TypeError("'coroutine' object is not iterable"), TypeError('vars() argument must have __dict__ attribute')]
我怀疑 Pydantic 的工作原理是我必须让它异步
我发现有趣的是,所有 FastAPI JWT Auth 代码示例都使用同步函数定义,而所有 FastAPI 示例都使用异步。有点难以解开。以上是关于如何/我可以在条带 webhook 处理程序中调用 FASTAPI 异步函数,还是我的方法完全错误?的主要内容,如果未能解决你的问题,请参考以下文章