首页 >后端开发 >Python教程 >可扩展的 Python 后端:使用 uv、Docker 和预提交构建容器化 FastAPI 应用程序:分步指南

可扩展的 Python 后端:使用 uv、Docker 和预提交构建容器化 FastAPI 应用程序:分步指南

Susan Sarandon
Susan Sarandon原创
2025-01-17 22:17:12614浏览

在当今的容器化世界中,高效的后端应用程序部署至关重要。 FastAPI 是一种流行的 Python 框架,擅长创建快速、高性能的 API。 我们将使用包管理器 uv 来简化依赖管理。

紫外线

假设您已经安装了 uv 和 Docker,让我们创建我们的应用程序:uv init simple-app。这会生成:

<code>simple-app/
├── .python-version
├── README.md
├── hello.py
└── pyproject.toml</code>

pyproject.toml 保存项目元数据:

<code class="language-toml">[project]
name = "simple-app"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.11"
dependencies = []</code>

将项目依赖项添加到pyproject.toml

<code class="language-toml">dependencies = [
    "fastapi[standard]=0.114.2",
    "python-multipart=0.0.7",
    "email-validator=2.1.0",
    "pydantic>2.0",
    "SQLAlchemy>2.0",
    "alembic=1.12.1",
]

[tool.uv]
dev-dependencies = [
    "pytest=7.4.3",
    "mypy=1.8.0",
    "ruff=0.2.2",
    "pre-commit=4.0.0",
]</code>

[tool.uv] 部分定义了部署期间排除的开发依赖项。 运行 uv sync 到:

  1. 创建uv.lock
  2. 创建虚拟环境 (.venv)。 uv 如果需要,下载 Python 解释器。
  3. 安装依赖项。

FastAPI

创建 FastAPI 应用程序结构:

<code>recipe-app/
├── app/
│   ├── main.py
│   ├── __init__.py
│   └── ...
├── .python-version
├── README.md
└── pyproject.toml</code>

app/main.py中:

<code class="language-python">from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Hello(BaseModel):
    message: str

@app.get("/", response_model=Hello)
async def hello() -> Hello:
    return Hello(message="Hi, I am using FastAPI")</code>

运行:uv run fastapi dev app/main.py。 您将看到类似于以下内容的输出:

Scalable Python backend: Building a containerized FastAPI Application with uv, Docker, and pre-commit: a step-by-step guide

访问https://www.php.cn/link/c099034308f2a231c24281de338726c1

Docker

让我们 Docker 化。我们将在容器内开发。 添加Dockerfile

<code class="language-dockerfile">FROM python:3.11-slim

ENV PYTHONUNBUFFERED=1

COPY --from=ghcr.io/astral-sh/uv:0.5.11 /uv /uvx /bin/

ENV UV_COMPILE_BYTE=1
ENV UV_LINK_MODE=copy

WORKDIR /app

ENV PATH="/app/.venv/bin:$PATH"

COPY ./pyproject.toml ./uv.lock ./.python-version /app/

RUN --mount=type=cache,target=/root/.cache/uv \
    --mount=type=bind,source=uv.lock,target=uv.lock \
    --mount=type=bind,source=pyproject.toml,target=pyproject.toml \
    uv sync --frozen --no-install-project --no-dev

COPY ./app /app/app

RUN --mount=type=cache,target=/root/.cache/uv \
    uv sync --frozen --no-dev

CMD ["fastapi", "dev", "app/main.py", "--host", "0.0.0.0"]</code>

为了更轻松地管理容器,请使用 docker-compose.yaml:

<code class="language-yaml">services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    working_dir: /app
    volumes:
      - ./app:/app/app
    ports:
      - "${APP_PORT:-8000}:8000"
    environment:
      - DATABASE_URL=${DATABASE_URL}
    depends_on:
      - postgres

  postgres:
    image: postgres:15
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data: {}</code>

创建一个包含环境变量的.env文件。 运行:docker compose up --build.

[tool.uv] 和开发工具

[tool.uv]中的pyproject.toml部分列出了开发工具:

  • pytest:测试框架(超出此处范围)。
  • mypy: 静态类型检查器。手动运行:uv run mypy app.
  • ruff: 快速 linter(替换多个工具)。
  • 预提交: 管理预提交挂钩。创建.pre-commit-config.yaml
<code class="language-yaml">repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.4.0
    hooks:
      - id: check-added-large-files
      - id: check-toml
      - id: check-yaml
        args:
          - --unsafe
      - id: end-of-file-fixer
      - id: trailing-whitespace
  - repo: https://github.com/astral-sh/ruff-pre-commit
    rev: v0.8.6
    hooks:
      - id: ruff
        args: [--fix]
      - id: ruff-format</code>

pyproject.tomlmypy添加ruff配置(原文提供示例)。 安装 VS Code Ruff 扩展以进行实时 linting。 此设置可确保一致的代码风格、类型检查和预提交检查,以实现简化的工作流程。

以上是可扩展的 Python 后端:使用 uv、Docker 和预提交构建容器化 FastAPI 应用程序:分步指南的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn