- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我开始工作的 FastAPI 应用程序使用了几个服务,我只想在应用程序启动时初始化一次,然后在不同的地方使用这个对象的方法。
它可以是云服务或任何其他重级别。
可能的方法是使用 Lazy loading
并与 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}
也可以用
@app.on_event("startup")
事件在那里初始化重类,但不知道如何在不使用
singleton
的情况下从每个地方访问这个初始化的对象.
request
传递给每个非路由函数。
最佳答案
在启动 FastAPI 应用程序之前初始化重对象通常是个好主意。这样,当应用程序开始监听连接(并且由负载平衡器提供)时,您就完成了初始化。
您可以在设置应用程序和主路由器的同一位置设置这些依赖项并进行任何初始化,因为它们也是应用程序的一部分。我通常通过一个轻量级服务暴露重对象,该服务将有用的端点暴露给 Controller 本身,然后通过 Depends
注入(inject)服务对象。 .
您希望如何执行初始化取决于您在应用程序中的其他要求 - 例如,如果您计划在 cli 工具中重用基础设施或在 cron 中使用它们。
这是我在几个项目中一直采用的方式,到目前为止效果很好,并将代码更改保留在他们自己的附近。
模拟重型类 heavylifting/heavy.py
与 from .heavy import HeavyLifter
在 __init__.py
:
import time
class HeavyLifter:
def __init__(self, initial):
self.initial = initial
time.sleep(self.initial)
def do_stuff(self):
return 'we did stuff'
在名为
foo
的模块中创建的骨架项目(
heavylifting
现在位于
foo/heavylifting
下,以便理解下面的导入):
from fastapi import FastAPI, APIRouter
from .heavylifting import HeavyLifter
heavy = HeavyLifter(initial=3)
from .views import api_router
app = FastAPI()
app.include_router(api_router)
foo/services.py
Depends
对该服务的要求。
class HeavyService:
def __init__(self, heavy):
self.heavy = heavy
def operation_that_requires_heavy(self):
return self.heavy.do_stuff()
class OtherService:
def __init__(self, heavy_service: HeavyService):
self.heavy_service = heavy_service
def other_operation(self):
return self.heavy_service.operation_that_requires_heavy()
foo/app_services.py
from .app import heavy
from .services import HeavyService, OtherService
from fastapi import Depends
async def get_heavy_service():
return HeavyService(heavy=heavy)
async def get_other_service_that_uses_heavy(heavy_service: HeavyService = Depends(get_heavy_service)):
return OtherService(heavy_service=heavy_service)
foo/views.py
from fastapi import APIRouter, Depends
from .services import OtherService
from .app_services import get_other_service_that_uses_heavy
api_router = APIRouter()
@api_router.get('/')
async def index(other_service: OtherService = Depends(get_other_service_that_uses_heavy)):
return {'hello world': other_service.other_operation()}
main.py
app.py
以及。
from fooweb.app import app
if __name__ == '__main__':
import uvicorn
uvicorn.run('fooweb.app:app', host='0.0.0.0', port=7272, reload=True)
通过这种方式,重客户端在启动时被初始化,而 uvicorn 在一切正常时开始服务请求。根据重客户端的实现方式,如果套接字因不活动而断开连接(正如大多数数据库库所提供的那样),它可能需要池化并重新创建套接字。
关于python - 在 FastAPI 中仅初始化一次繁重服务的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67663970/
我正在研究最适合我的 Web 框架。 我们将开发几个微服务,我们需要在一些微服务上分派(dispatch)事件,这些事件可以在其他微服务上监听。 是否支持使用 FastAPI?如果没有,有没有办法监听
快速API 0.68.0 python 3.8 from fastapi import Depends, FastAPI, Header, HTTPException async def verify
在 FastAPI 框架内: 虽然请求数据当然可以作为参数传递,但我想知道函数是否可以在不传递参数的情况下访问有关当前请求的信息。 免责声明:我不认为全局访问请求数据是一个好的做法,但我有一个用例,如
无论如何,FastAPI“依赖项”是否可以解释路径参数。 我有很多形式的功能: @app.post("/item/{item_id}/process", response_class=ProcessR
我有一个由诗歌构建的 fastapi 项目。我想使用 pyproject.tom 中的脚本部分运行应用程序,如下所示: poetry run start 该部分的双引号内是什么? [tool.poet
我正在尝试将分页添加到我的 fastapi 项目中。所以我决定使用这个: fastapi-contrib 我在那里遵循相同的示例,但由于某种原因我收到此错误: type object 'MOrdene
在我的项目文件夹中,我有一个基本的 index.html文件加上静态文件(js、css)以及我的 main.py : from fastapi.staticfiles import StaticFil
FastAPI显示可以设置response_model_exclude_none=True在装饰器中忽略值为 None 的字段:https://fastapi.tiangolo.com/tutoria
FastAPI 生成自动 swagger/openapi 文档。 在 https://fastapi.tiangolo.com/tutorial/response-status-code 的教程中有一
我获得了使用FastApi运行推理服务器的以下代码。在大约8小时内,我的RAM内存增加了4Gi。。更有趣的是,当我停止我的容器时,内存并没有清理干净。。例如,在运行Docker Container之前
今天的文章分享如下在 FastAPI 框架下,使用 pytest 来自动化测试数据库相关的接口,文章的最后给出全部代码。 最近越来越喜欢使用 FastAPI 来写后端服务了,因为它是 Pyth
Docker 学习 https://www.cnblogs.com/poloyy/p/15257059.html 项目结构 .├── app│ ├── __init__.py│ └
下面代码来自官方FastAPI tutorials page ,我无法理解这些语句(例如,name: str)。 from typing import Optional from fastapi im
我是网络通信的新手。我使用 ubuntu 并尝试学习 fastapi。但是,我认为很难理解如何格式化我打算发送回客户端的响应。 要发回的响应的规则是什么?如果您想发回自定义答案 - 例如两个图像文件
我正在尝试从文件中添加路由,但我事先并不知道实际的参数,因此我需要一个通用函数来通过 **kwargs 处理参数。 要添加路由,我正在使用 add_api_route,如下所示: from fasta
我按照此文档设置了一个用户: https://fastapi.tiangolo.com/advanced/security/http-basic-auth/ 但我只收到一个端点“/users/me”的
当我尝试从我的 postgre 数据库中获取一些数据并使用 fastapi 时出现此错误。 我不知道为什么会这样......但这是我的代码,谢谢你的帮助。 路线 @router.get("/fuent
我有一个与在 pycharm 中使用 uvicorn 的 FastAPI 有关的问题。我的项目具有以下结构: LearningPy | |-- apis -----|--modelser
我已经创建了一个登录路径,我在其中发布了我的表单数据并设置了一个 cookie。设置 cookie 后,我重定向到“/main”,在那里我得到 {detail:"Method Not Allowed"
当我使用 FastAPI 时,如何为网络服务指定基本路径? 换句话说 - FastAPI 对象是否有参数可以将端点和我定义的任何其他对象设置为不同的根路径? 例如,如果我的代码带有下面的虚假参数 ro
我是一名优秀的程序员,十分优秀!