小编Ent*_*iff的帖子

在 FastAPI 中仅初始化一次重型服务的最佳方法

我开始开发的 FastAPI 应用程序使用了多个服务,我只想在应用程序启动时初始化一次这些服务,然后在不同的地方使用该对象的方法。
它可以是云服务或任何其他重型服务。

可能的方法是使用Lazy loading和 with来实现Singlenton pattern,但我正在寻找更好的 FastAPI 方法。

另一种可能的方法是使用Depends类并缓存它,但它的使用仅对路由方法有意义,而对从路由方法调用的其他常规方法则无效。
例子:

async def common_parameters(q: Optional[str] = None, skip: int = 0, limit: int = 100):
    return {"q": q, "skip": skip, "limit": limit}  
    

async def non_route_function(commons: dict = Depends(common_parameters)):
    print(commons)         # returns `Depends(common_parameters)` 
    

@router.get('/test')
async def test_endpoint(commons: dict = Depends(common_parameters)):
    print(commons)         # returns correct dict
    await non_route_function()
    return {'success': True}
Run Code Online (Sandbox Code Playgroud)

还可以使用@app.on_event("startup")事件来初始化重类,但不知道如何使这个初始化的对象可以从每个地方访问,而不使用singleton.

另一种丑陋的方法是将初始化的对象保存到 @app( 中,然后从请求中获取此应用程序,但随后您必须传递request到每个非路由函数中。

我描述的所有方法要么是丑陋的、不方便的、非Pythonic的,要么是更糟糕的实践,我们这里也没有像flask中那样的线程局部变量和代理对象,那么对于我描述的此类问题的最佳方法是什么多于?

谢谢!

python singleton global initialization fastapi

14
推荐指数
1
解决办法
1万
查看次数

通过 Instagram graph api 刷新长期令牌

我在后端拥有长期存在的用户令牌,并成功从 graph-api 端点获取不同的信息。

现在,我尝试定期刷新我这边的这些有效、未过期的令牌,并遵循刷新访问令牌文档,但每次都会收到 400 状态代码的错误:

我的请求:

curl -X GET \
  'https://graph.instagram.com/refresh_access_token?grant_type=ig_refresh_token&&access_token={my_token}'
Run Code Online (Sandbox Code Playgroud)

回复:

Sorry, this content isn't available right now
Run Code Online (Sandbox Code Playgroud)

为了确保该令牌有效,通过Access Token Debugger 工具进行了检查,看来我的令牌在接下来的 3 个月内有效。

我发现其他几位工程师也有同样的问题,但无法找到任何解决办法或此问题的原因。

有什么解决办法吗?

facebook-graph-api instagram-api instagram-graph-api

5
推荐指数
1
解决办法
1739
查看次数