从 2026 Django 开发者调查到可复现构建:团队该如何使用 LLM 与锁定依赖

2026-09-11 35 预计阅读时间: 1 分钟
来源: realpython.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:9 分钟

2026 年 Django 开发者调查把两个正在重塑 Python 团队工作方式的话题放到了一起:开发者如何把 LLM 纳入日常开发,以及项目如何获得稳定、可复现的构建。前者提高编码速度,后者控制交付风险;如果只关注其中一边,团队很容易得到“写得更快、坏得也更快”的结果。

来源摘要没有提供具体比例,因此不宜凭空解读调查数字。但这些问题本身已经足够明确:LLM 正在成为开发流程的一部分,而依赖、解释器和构建环境必须被更严格地固定下来。

LLM 更适合缩短反馈周期,而不是替代工程判断

在 Django 项目中,LLM 很容易生成模型、视图、表单、测试和迁移建议。真正影响结果的,不是“是否使用 AI”,而是团队把它放在哪一个环节。

比较稳妥的用途包括:

  • 根据既有模型补充单元测试和边界案例;
  • 解释 ORM 查询并指出潜在的 N+1 查询;
  • 为重复的管理命令、序列化器或表单生成初稿;
  • 总结错误堆栈,给出排查顺序;
  • 协助升级 Django,并整理废弃 API 的替换清单。

风险较高的用途则包括:

  • 未经审查就执行模型生成的数据迁移;
  • 把生产日志、用户数据或密钥直接发送给外部模型;
  • 接受没有测试覆盖的认证、权限或支付代码;
  • 让模型自行决定依赖升级范围。

可以给团队准备一个带约束的提示词,而不是只说“帮我写测试”:

你正在审查一个 Django 5.x 项目。

任务:为下面的服务函数生成 pytest 测试。
约束:
1. 不修改生产代码。
2. 覆盖正常路径、权限失败、重复请求和数据库回滚。
3. 不猜测不存在的模型字段;缺少信息时列出问题。
4. 禁止真实网络请求,使用 mock。
5. 输出测试代码,并解释每个测试防止了什么回归。

项目约定:pytest-django,Python 3.12,时区使用 UTC。

这类提示词把模型定位为“受约束的代码助手”。生成内容仍然需要经过格式化、静态检查、测试和人工评审。

可复现构建不只是锁住 Django 版本

仅在 requirements.txt 中写 Django>=5,无法保证开发机、CI 和生产环境安装到相同内容。不同时间解析依赖,可能得到不同的传递依赖版本;Python 小版本、操作系统和 CPU 架构也可能影响最终安装的 wheel。

一个更完整的可复现边界通常包含:

  • 固定 Python 版本;
  • 锁定直接依赖和传递依赖;
  • 校验下载包的哈希;
  • 在干净环境中执行测试;
  • 记录操作系统或容器基础镜像;
  • 明确区分“重新生成锁文件”和“按照锁文件安装”。

锁文件并不意味着永不升级。它的作用是把升级从一次不可见的安装副作用,变成一次可审查的代码变更。

可以这样实践:为 Django 项目生成带哈希的依赖文件

下面是一套可直接改造的 pip-tools 流程。示例假设使用 Python 3.12;运行前请把 Django 和数据库驱动版本范围换成项目实际支持的范围。

创建 requirements.in

Django>=5.0,<5.3
psycopg[binary]>=3.1,<4

创建 requirements-dev.in

-c requirements.txt
pytest>=8,<9
pytest-django>=4.8,<5
ruff>=0.6,<1

生成并安装锁定依赖:

python3.12 -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install pip-tools

pip-compile --generate-hashes --resolver=backtracking \
  --output-file=requirements.txt requirements.in

pip-compile --generate-hashes --resolver=backtracking \
  --output-file=requirements-dev.txt requirements-dev.in

pip-sync requirements.txt requirements-dev.txt
python -m pip check

提交 requirements.inrequirements-dev.in 和生成的两个锁定文件。CI 与生产构建只负责安装,不应在每次运行时重新解析版本:

python -m pip install --require-hashes -r requirements.txt
python manage.py check
python manage.py test

--require-hashes 可以阻止未记录或内容不匹配的分发包被悄悄安装。需要注意,锁文件可能与平台相关:如果 Linux CI、macOS 开发机和 ARM 生产环境可用的 wheel 不同,应分别验证,必要时为不同目标生成锁文件。

把环境也纳入构建边界

依赖完全一致,但 Python 补丁版本或系统库不同,结果仍可能漂移。团队可以进一步使用固定摘要的容器镜像。以下写法是实践示例,并不代表来源节目指定了 Docker:

FROM python:3.12.8-slim

ENV PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1

WORKDIR /app
COPY requirements.txt ./
RUN python -m pip install --no-cache-dir --require-hashes -r requirements.txt

COPY . .
RUN python manage.py check
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

正式环境还应考虑使用镜像 digest,而不是只依赖可移动标签,并通过 Gunicorn、Uvicorn 等生产级服务器启动 Django。数据库、系统级动态库和外部服务版本也需要记录,否则“容器可复现”仍只是部分可复现。

把 AI 生成内容放进同一条质量流水线

LLM 不应拥有一条绕过现有规范的快速通道。无论代码由谁生成,都可以进入相同的 CI:

name: django-ci

on:
  pull_request:
  push:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: "3.12.8"
          cache: pip
      - run: python -m pip install --require-hashes -r requirements-dev.txt
      - run: python -m pip check
      - run: ruff check .
      - run: python manage.py check
      - run: pytest -q

这里的关键不是某个特定 CI 产品,而是建立不可跳过的验证顺序:锁定安装、依赖一致性检查、静态检查、Django 系统检查和自动化测试。

采用时的检查清单

团队不必一次重建全部工具链,可以先完成几个高收益动作:

  • 固定 Python 版本,并让本地、CI 和生产尽量一致;
  • 将宽泛的依赖声明编译为可审查的锁文件;
  • 在 CI 中使用哈希校验安装,而不是现场重新解析依赖;
  • 要求 LLM 生成的代码附带测试,并接受同样的代码评审;
  • 禁止把密钥、生产数据和未脱敏日志提交给外部模型;
  • 定期、主动地更新锁文件,并通过自动化测试验证升级;
  • 在不同操作系统或架构上验证包含原生扩展的依赖。

LLM 能让 Django 开发更快,但速度需要由可复现环境和自动化验证托底。真正成熟的流程不是排斥生成式工具,而是确保每一份代码——无论来自开发者还是模型——都能在明确、稳定、可审计的环境里被构建和验证。


相关推荐