Django被贴上“包含电池”的标签已有十余年,它提供了ORM、Admin、Auth、Forms、Template等一揽子解决方案,甚至自带的开发服务器也曾被嘲笑为“玩具”。而在今天,微服务、Serverless、Edge Computing等概念层出不穷,Django的“厚重”似乎成了原罪——人们认为它过于笨重,启动慢,不适合分布式,也难以水平扩展。然而,这种批评往往建立在错误的假设上:所有项目都需要成为Google。如果放下对“流行”的执念,重新审视Django的架构哲学,你会发现,它的“厚重”并非弱点,而是一种对抗复杂性的盔甲。这篇文章不打算教你怎么写Django代码,而是想和你探讨:在人人高喊“微服务”的浪潮中,为什么不假思索地抛弃Django可能是一种代价高昂的决策?
微服务的核心卖点是独立部署、独立扩展和团队自治。但为了这些利益,你必须支付极其高昂的间接成本:服务发现、分布式事务、消息队列、链路追踪、配置中心、API网关……每一项都是复杂的分布式系统难题。Saga模式、最终一致性、幂等性控制,这些词汇听起来高深,却会让一支十人团队在项目早期就陷入泥潭。而Django的单体架构将这一切简单化为一个进程:你可以直接读写同一个数据库,用信号Signal解耦业务,用事务Atomic保证一致性。没有网络跳数延迟,没有网络分区焦虑,你只需要关注业务逻辑本身。我还记得前公司的一个服务,从单体拆成6个微服务后,每个接口延迟反而从50毫秒上升到200毫秒,运维每周要处理Nginx重写规则和Kafka积压。讽刺的是,我们最初拆分的理由只是“提升性能”。所以,微服务的优势不是不存在,而是它在大多数场景中都是被过度推理出来的。
真正独立的观点是:Django的App机制,本质上是一种比微服务更高级的“模块化单体”。每个App可以拥有自己的Models、Views、Urls和Templates,彼此之间通过独立命名空间和弱引用进行协作。你可以把UserApp和OrderApp看作两个逻辑独立的服务,只是它们共享同一个数据库和进程。这种设计避免了微服务中的网络通信开销和数据库分库难题,同时仍然保留了代码级别的边界。例如,一个大型电商项目,我们可以抽出用户、商品、订单、支付、物流等App,在代码层面它们互不依赖,各自维护自己的模型和视图,通过信号或服务层进行交互。当业务增长时,你可以选择将某一个App拆成独立服务,而不需要重写整个项目——因为Django的App边界本来就是为了隔离。相比之下,直接以微服务起步的项目,常常在还没验证商业模式时就被基础设施拖垮。Django给你的不是限制,而是“可渐进演进”的自由——你可以从单体开始,在必要时拆分,而非一开始就负重跑马拉松。
当然,你需要正视Django的短板。在纯异步和高并发场景下,源自同步IO的Django确实不如FastAPI或Node.js响应迅速。Django 3.0之后虽然加入了ASGI支持,但生态中大量同步库(如ORM)仍会阻塞事件循环,且多数开发者的异步用法并不成熟。这造成了“Django不行”的普遍印象。但我想说,这是“用错了地方”的代价,而不是“东西本身”的错。电商后台、CMS、管理接口、内部工具——这些密集的CRUD和业务逻辑场景,恰恰需要Django的Admin和ORM来减少80%的重复代码。FastAPI能给你50K级的QPS,但你得自己处理用户认证、权限管理、分页、过滤、序列化和数据库迁移;Django用DRF和Django Guardian直接给你一套为九成场景设计了标准方案的工具集。再说一个不常被提及的数据:Django的模板层虽然被批评为“简陋”,但它在服务端渲染场景里几乎没有学习曲线,配合HTMX或Alpine.js,足以应付大部分需要SEO或快速上线的业务。反观那些前后端完全分离的方案,前端一套,后端一套,团队规模和沟通成本直接翻倍。对于十人以下的团队,Django的“单语言”优势(前后端都使用Python)反而是一种隐形财产。
最后,我想用生态学的“列/丛”模拟来做一个总结:微服务是“丛林战略”,每个服务像一棵独立的树,看起来强大,但需要复杂的根系网络才能彼此支撑;而Django是“草原战略”,所有根茎交织成一张厚实的草毯,也许不够有科技感,但耐践踏、易修复、能适应多种气候。在真实的世界里,大多数软件项目都是中小型业务流,它们需要的是稳定的底座和快速的反馈循环,而不是无穷尽的架构弹性。Django已经存在了二十年,它的“厚重”是无数项目实践沉淀出的成熟,而不是刻舟求剑的顽固。如果你正在为一个三到五年的项目选型,在预算和团队都有限的前提下,请认真想想:微服务真的能解决你面临的核心痛点吗?还是说它只是让你感觉自己很“时代”?Django不会给你炫酷的分布式演示,但它能让你少掉一些头发,多活几年。这或许才是对“厚重”最好的解读——厚重是压舱石,而非绊脚石。选择Django,不是因为它旧,而是因为它可靠;不是因为它重,而是因为它能承载那些轻易就会被浪潮冲散的微小价值。