首頁 > 後端開發 > Python教學 > 可擴展的 Python 後端:使用 uv、Docker 和預先提交構建容器化 FastAPI 應用程式:逐步指南

可擴展的 Python 後端:使用 uv、Docker 和預先提交構建容器化 FastAPI 應用程式:逐步指南

Susan Sarandon
發布: 2025-01-17 22:17:12
原創
613 人瀏覽過

在當今的容器化世界中,高效的後端應用程式部署至關重要。 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板