MST

星途 面试题库

面试题:Python的FastAPI实现RESTful API的依赖注入优化

阐述FastAPI中依赖注入的概念和使用场景。假设你有一个需要进行数据库连接的API端点,如何通过依赖注入来管理数据库连接,以提高代码的可维护性和性能,并防止资源泄漏?请给出具体代码示例。
34.3万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

1. FastAPI中依赖注入的概念

依赖注入(Dependency Injection)是一种软件设计模式,它允许我们将对象所依赖的其他对象(即依赖项)通过外部传入,而不是在对象内部自行创建。在FastAPI中,依赖注入是一种核心机制,它使我们能够解耦不同部分的代码,使代码更易于测试、维护和复用。

2. 使用场景

  • 数据库连接管理:避免在每个API端点重复创建和管理数据库连接,提高性能并防止资源泄漏。
  • 身份验证和授权:将身份验证逻辑作为依赖项注入到需要验证用户身份的API端点。
  • 公共业务逻辑复用:例如日志记录、数据验证等逻辑,可作为依赖项在多个端点复用。

3. 数据库连接管理示例代码

from fastapi import Depends, FastAPI
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, Session

# 创建数据库引擎
SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(
    SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)


# 创建数据库会话的依赖项
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()


app = FastAPI()


@app.get("/items/")
def read_items(db: Session = Depends(get_db)):
    # 使用数据库会话进行数据库操作
    result = db.execute("SELECT * FROM items")
    items = result.fetchall()
    return items

在上述代码中:

  • get_db函数是一个依赖项,它创建一个数据库会话,并在请求处理完成后关闭会话,确保资源不会泄漏。
  • read_itemsAPI端点中,通过db: Session = Depends(get_db)将数据库会话作为依赖项注入,这样每个请求都可以使用这个数据库会话进行数据库操作,提高了代码的可维护性和性能。