用 uv 起一个最小 Django 5 项目(替代 pip + venv)

uv 是 Astral(Ruff 团队)的 Python 项目管理器,Rust 写的,
pip + venv + pip-tools 快 10-100 倍。2024 之后基本是新项目的默认。

下面 5 分钟起一个 Django 5 项目。

1. 装 uv

curl -LsSf https://astral.sh/uv/install.sh | sh
# 或 macOS: brew install uv
# 或 Windows: powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
uv --version

2. 起项目

uv init myapp --python 3.12
cd myapp

uv init 生成 pyproject.toml + .python-version + hello.py
不创建 venv 直到需要。

3. 加依赖

uv add django gunicorn psycopg[binary] python-dotenv
uv add --dev ruff pytest pytest-django

uv add 会:

  1. 解析依赖(极快)
  2. 写入 pyproject.toml
  3. 锁定到 uv.lock
  4. 装到 .venv/(自动创建)

psycopg[binary] 是 psycopg3 的预编译版(生产建议 psycopg[c] 自己编)。

4. Django 项目结构

uv run django-admin startproject myapp .
uv run python manage.py startapp blog

uv run 等价于"在项目 venv 里跑"。比 source .venv/bin/activate && python ...
直接,跨 shell / CI 都一样。

5. 跑

uv run python manage.py migrate
uv run python manage.py createsuperuser
uv run python manage.py runserver

6. CI / Docker 中使用

Dockerfile

FROM python:3.12-slim

# 装 uv 二进制
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv

WORKDIR /app
COPY pyproject.toml uv.lock ./
# --frozen 严格按 lock 安装,不解析
RUN uv sync --frozen --no-install-project

COPY . .
RUN uv sync --frozen
EXPOSE 8000
CMD ["uv", "run", "gunicorn", "myapp.wsgi:application", "-b", "0.0.0.0:8000"]

GitHub Actions:

- uses: astral-sh/setup-uv@v3
  with:
    enable-cache: true
- run: uv sync --frozen
- run: uv run pytest

enable-cache: true 跨 job 缓存 wheel,CI 飞快。

7. 升级 / 锁定

uv lock --upgrade-package django   # 只升 django
uv lock --upgrade                  # 全部升到最新允许的范围
uv add 'django>=5.1,<6'            # 改约束
uv pip compile pyproject.toml > requirements.txt   # 兼容 pip 导出

8. 与 pip / poetry 对比

操作 pip / pip-tools uv
装 100 个依赖 30-60s 1-3s
解析 lock 几秒到几十秒 < 1s
创建 venv python -m venv .venv (慢) 自动且快
跨平台 lock 麻烦 内置
Python 多版本 pyenv 配合 uv python install 3.12 内置

踩过的坑

  • uv.lock 必须进 git。它包含跨平台依赖锁,删了会让 uv sync --frozen 失败。
  • uv add 默认只在主 group;要 dev 依赖加 --dev;要 optional group
    --optional groupname
  • psycopg[binary] 在 musl-libc(Alpine)镜像上没预编译 wheel,会回退到
    源码编译——慢。改用 python:3.12-slim(glibc)镜像。
  • VSCode 自动识别 .venv/ —— 但要把 Python 解释器手动选为 .venv/bin/python
    否则 import 检查走系统 Python。
精确评价 共 0 人评价
可复现性
可复现 · 0 不可复现 · 0
文风
文风流畅 · 0 文风晦涩 · 0
立场
支持 · 0 反对 · 0

登录后即可对本帖作出评价。

评论区 0 条 · 所有人可在此交流

登录后参与评论。

还没有评论,来说两句。