首页 > 后端开发 > Python教程 > 为什么应该使用单个 FastAPI 应用程序和 TestClient 实例

为什么应该使用单个 FastAPI 应用程序和 TestClient 实例

Barbara Streisand
发布: 2025-01-18 22:15:09
原创
600 人浏览过

Why You Should Use a Single FastAPI App and TestClient Instance

在 FastAPI 开发中,特别是对于大型项目,在整个项目中使用单个 FastAPI 应用程序实例和单个 TestClient 实例对于保持一致性、优化性能和确保可靠性至关重要。 让我们研究一下这种最佳实践背后的原因并探索实际示例。

1.应用程序范围内的一致性

创建多个 FastAPI 应用实例可能会导致不一致。每个实例都拥有自己的内部状态、中间件配置和依赖关系管理。 跨多个实例共享有状态数据(例如内存存储或数据库连接)可能会导致不可预测的行为和错误。

2.增强的性能

每个 TestClient 实例建立自己的 HTTP 连接并初始化依赖项。使用单个 TestClient 可最大限度地减少开销,从而加快测试执行速度。

3.防止初始化问题

FastAPI 应用程序经常在启动期间初始化资源,包括数据库连接或后台任务。 多个实例可能会导致冗余初始化或资源冲突。

实践代码示例

正确方法:单个应用程序和 TestClient

<code class="language-python">from fastapi import FastAPI, Depends
from fastapi.testclient import TestClient

# Single FastAPI app instance
app = FastAPI()

# Simple in-memory database
database = {"items": []}

# Dependency function
def get_database():
    return database

@app.post("/items/")
def create_item(item: str, db: dict = Depends(get_database)):
    db["items"].append(item)
    return {"message": f"Item '{item}' added."}

@app.get("/items/")
def list_items(db: dict = Depends(get_database)):
    return {"items": db["items"]}

# Single TestClient instance
client = TestClient(app)

# Test functions
def test_create_item():
    response = client.post("/items/", json={"item": "foo"})
    assert response.status_code == 200
    assert response.json() == {"message": "Item 'foo' added."}

def test_list_items():
    response = client.get("/items/")
    assert response.status_code == 200
    assert response.json() == {"items": ["foo"]}</code>
登录后复制

错误方法:多个实例

<code class="language-python"># Incorrect: Multiple app instances
app1 = FastAPI()
app2 = FastAPI()

# Incorrect: Multiple TestClient instances
client1 = TestClient(app1)
client2 = TestClient(app2)

# Problem: State changes in client1 won't affect client2</code>
登录后复制

多实例的常见问题

  1. 不一致的状态:共享状态(如数据库)在不同的应用程序实例之间独立运行。
  2. 冗余依赖项初始化:数据库连接等依赖项可能会多次初始化,可能导致资源耗尽。
  3. 重叠的启动/关闭事件:多个应用实例独立触发启动和关闭事件,导致不必要或冲突的行为。

最佳实践

可重用性项目结构

在单独的文件(例如 app.py)中创建 FastAPI 应用程序并在需要时导入。

<code class="language-python"># app.py
from fastapi import FastAPI

app = FastAPI()
# Add your routes here</code>
登录后复制
<code class="language-python"># main.py
from fastapi.testclient import TestClient
from app import app

client = TestClient(app)</code>
登录后复制

利用共享实例的 pytest 装置

pytest 装置有效管理共享资源,例如 TestClient:

<code class="language-python">import pytest
from fastapi.testclient import TestClient
from app import app

@pytest.fixture(scope="module")
def test_client():
    client = TestClient(app)
    yield client  # Ensures proper cleanup</code>
登录后复制
<code class="language-python">def test_example(test_client):
    response = test_client.get("/items/")
    assert response.status_code == 200</code>
登录后复制

相关文档

  • Starlette 测试客户端
  • 使用 FastAPI 进行测试
  • pytest 装置

通过遵守这些准则,您的 FastAPI 项目将更加一致、高效且更易于维护。


肖恩·杜塔拍摄:https://www.php.cn/link/e2d083a5fd066b082d93042169313e21

以上是为什么应该使用单个 FastAPI 应用程序和 TestClient 实例的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板