Kati Michel:从 Django 社区志愿者到基础设施平台工程师

2026-07-30 12 预计阅读时间: 1 分钟
来源: djangoproject.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.

预计阅读时间:10 分钟

2026 年 7 月,Django Software Foundation 将月度成员荣誉授予 Katherine “Kati” Michel。她从 2016 年开始参与 DjangoCon US 网站建设,随后长期担任大会网站主席、联合主席和 DEFNA 董事。如今,她在 JPMorganChase 的基础设施平台与数据库部门担任软件工程师,参与构建本地部署的缓存服务。

Kati 的经历展示了 Django 的两种生命力:一方面,它能支撑数据库密集型业务和内部控制平面;另一方面,社区成员可以从一次文档或网站贡献开始,逐步进入会议组织、开源治理和大型基础设施工程。

Django 不只适合内容网站

Django 诞生于新闻编辑部,但 Kati 当前参与的项目远超传统内容管理场景。她所在的团队从零构建本地缓存服务,由 React 提供操作界面,Django 作为控制平面,根据内部客户需求编排分布式系统的部署任务;底层还涉及 Ansible、Red Hat Enterprise Linux 和分布式拓扑设计。

这种架构里,Django 不必亲自处理缓存数据流。它更适合负责控制平面的工作:

  • 保存集群、节点和部署任务的期望状态;
  • 验证用户输入并执行权限检查;
  • 调度 Ansible 或后台任务;
  • 通过管理后台支持运维人员检查和修正数据;
  • 向 React 或其他客户端提供 API。

这也是 Django ORM、Admin 和内置安全机制仍然有竞争力的原因。团队无需重新拼装身份认证、数据库迁移、表单验证和后台管理等基础能力,可以把工程时间投入真正复杂的拓扑与编排逻辑。

一个简化的控制平面模型可以这样实践:

# control/models.py
from django.conf import settings
from django.db import models


class CacheCluster(models.Model):
    class Status(models.TextChoices):
        PENDING = "pending", "Pending"
        PROVISIONING = "provisioning", "Provisioning"
        READY = "ready", "Ready"
        FAILED = "failed", "Failed"

    name = models.CharField(max_length=100, unique=True)
    node_count = models.PositiveSmallIntegerField(default=3)
    status = models.CharField(
        max_length=20,
        choices=Status.choices,
        default=Status.PENDING,
    )
    requested_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.PROTECT,
        related_name="cache_clusters",
    )
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name

执行迁移后,这个模型可以立即接入 Django Admin,也可以继续封装成 API。真实系统还需要幂等任务、审计日志、密钥管理、失败重试以及部署状态回写,不能直接在 HTTP 请求中运行耗时的 Ansible playbook。

用 django-silk 找出不断变慢的查询

Kati 特别提到过一次典型的性能排查:随着数据库数据增长,页面查询越来越慢。她安装 django-silk 后发现了 N+1 查询,并通过逐步加入 select_related()prefetch_related(),直观看到 SQL 查询数量下降。

两者解决的问题相似,但工作方式不同:

  • select_related() 使用 SQL JOIN,适合外键和一对一关系;
  • prefetch_related() 执行额外查询,再由 Django 合并结果,适合多对多和反向外键关系。

下面是一组可以直接改造的安装与配置步骤:

python -m pip install django django-silk
python manage.py migrate
python manage.py runserver
# settings.py
INSTALLED_APPS = [
    # ...
    "silk",
]

MIDDLEWARE = [
    "silk.middleware.SilkyMiddleware",
    # ...
]
# urls.py
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path("admin/", admin.site.urls),
    path("silk/", include("silk.urls", namespace="silk")),
]

假设页面需要展示集群、申请人以及每个集群的节点,容易产生 N+1 查询的写法是:

clusters = CacheCluster.objects.all()

for cluster in clusters:
    print(cluster.requested_by.username)
    print([node.hostname for node in cluster.nodes.all()])

可以将查询改为:

clusters = (
    CacheCluster.objects
    .select_related("requested_by")
    .prefetch_related("nodes")
)

启动开发服务器后访问 /silk/,即可检查请求耗时和 SQL 数量。django-silk 会增加性能开销并记录请求信息,因此生产环境启用前必须评估访问控制、敏感数据和存储增长;更稳妥的做法通常是在本地、测试环境或受控的短期诊断窗口中使用。

稳定框架也需要更清晰的现代入口

Kati 希望 Django 保持成熟和稳定,同时通过有针对性的改进,服务那些原本会优先选择 FastAPI 或 JavaScript 框架的开发者。她关注的方向包括经典机器学习应用、LLM 聊天机器人、异步工作流、React/Angular/Vue 集成,以及 API 开发。

这里的关键未必是把所有功能塞进 Django 核心。Django 已支持不少现代模式,真正缺少的往往是容易发现、能够运行、明确说明边界的入门路径。例如:

  • 用 django-ninja、Pydantic 类型和 OpenAPI 构建 API;
  • 用 htmx 与模板局部更新实现轻量交互;
  • 将 Django 作为 React 应用背后的认证、数据和编排服务;
  • 把耗时的 AI 推理或基础设施任务交给任务队列;
  • 展示异步视图适用和不适用的场景。

以 API 为例,可以这样实践一个带类型约束的集群查询接口。以下示例假设项目已经安装 django-ninja,并存在前面的 CacheCluster 模型:

python -m pip install django-ninja
# control/api.py
from datetime import datetime

from ninja import NinjaAPI, Schema

from .models import CacheCluster

api = NinjaAPI(title="Cache Control API")


class ClusterOut(Schema):
    id: int
    name: str
    node_count: int
    status: str
    created_at: datetime


@api.get("/clusters", response=list[ClusterOut])
def list_clusters(request):
    return CacheCluster.objects.order_by("name")
# project/urls.py
from django.contrib import admin
from django.urls import path

from control.api import api

urlpatterns = [
    path("admin/", admin.site.urls),
    path("api/", api.urls),
]

运行服务后,接口位于 /api/clusters,OpenAPI 文档由 django-ninja 提供。实际部署时还应增加身份认证、分页、授权策略和查询上限。

社区贡献也是一条工程成长路径

Kati 最初是在 GitHub 上偶然发现 DjangoCon US 网站代码。她于 2016 年加入网站工作,借此熟悉 Git、GitHub 和项目代码;2017 年成为网站主席并加入 DEFNA 董事会。2019 年,她在 DjangoCon US sprint 期间完成第一次 Django Core 贡献,为使用 django-docker-box 运行测试补充说明。

这条路径没有要求贡献者一开始就修改 ORM 或异步内核。网站维护、文档、测试说明、会议组织和社区治理都是真实贡献,也能让参与者逐渐理解项目协作方式。

她对公开演讲的建议同样务实:先在部门内部试讲,再尝试本地 meetup 和会议闪电演讲,寻找导师帮助打磨提案,并把 CfP 被拒绝视为正常过程。演讲能力和开源贡献能力一样,都可以通过小规模、可重复的练习获得。

团队可以带走的行动清单

Kati 的经历给 Django 团队提供了几项具体参考:

  • 遇到页面随数据增长而变慢时,先测量 SQL 数量和耗时,再决定是否缓存;
  • 根据关系类型正确选择 select_related()prefetch_related()
  • 将 Django 放在控制平面,让任务队列和自动化工具处理长时间运行的工作;
  • 为 API、前端集成、AI 和异步场景维护可运行的示例,而不只是概念说明;
  • 从文档、测试、会议网站或本地社区开始贡献,不必等待一个“足够重要”的核心补丁;
  • 通过主动外展、导师机制和明确的参与路径,让更多人能够长期留在社区。

Django 的成熟不是停止变化,而是知道哪些基础能力必须保持稳定,哪些开发入口需要继续改善。Kati 横跨社区组织、开源贡献和企业基础设施的经历,恰好说明了这两件事可以同时发生。


相关推荐