重学 2010 风格:我为什么爱上 Django
Some more things about Django I've been enjoying
我最近正在尝试用 2010 年代的风格构建网站,即使用 SQL 数据库并在后端渲染 HTML。虽然这种模式让我感到陌生,但 Django 的许多特性让开发变得异常顺畅。从可读性极强的 query builders 到自动化的数据库迁移,再到模板过滤器和 querystring 的巧妙应用,Django 极大地提升了开发体验。不过,我也对使用继承组织代码感到不适,更倾向于函数式视图。此外,面对 LLM 爬虫带来的流量,我对 Django 的性能表现和缓存配置有了全新的认识,发现开启模板缓存能显著提升吞吐量。
在 Go 后端中,性能情况通常很简单,一切往往都快得足够,但 Django 站点却截然不同。
- echoangle
> 做了一些轻量级的负载测试(使用 ab -n 1000 -c 1),结果显示目前我们在一个约 10 美元/月的虚拟机上每秒只能处理大约 2-3 个请求。
> 开启模板缓存后,网站似乎能轻松应对每秒 12 个左右的请求,且 CPU 并未满载。我虽然没有仔细对比前后的基准测试数据,但这看起来确实带来了巨大的提升。
这看起来低得离谱,我觉得这里肯定还有其他问题。
- ranedk
我从 0.95 版本就开始使用 Django,从未见过其他框架能像它这样既拥有令人惊叹的 DSL 且灵活无比,又能让人轻松理解其背后的“魔法”。
在过去的 10 年里,即便是在 Golang 或 Java 技术栈中,我依然使用 Django 来处理模型和迁移。我甚至编写了生成器,利用 Django 模型来生成 Gorm(或其他框架)的 DAO 类或 Java Hibernate 类。
有了 LLM,事情变得更简单了:我现在可以在 Django 中编写所有模型和自定义 QuerySet,然后让 LLM 生成对应的 Golang DAO、setter 和 getter 方法……并针对 Django 生成的查询语句进行测试,以确保完整性。
Golang 中的 Atlas、sqlx、sqlc 以及其他所有 ORM 类工具,都无法像 Django 那样处理迁移。
- faangguyindia
我现在主要用 Go + SQLite 来处理以前用 Rails、JavaScript 或 Python 做的事情。
我觉得 Python Django 太浪费资源了,看看它的内存占用就知道了。
我其中一个 Web 应用后端(Go 编写)目前每秒处理约 100 个请求,查看 pprof 发现瓶颈不在 CPU,而主要在 IO,这点我很喜欢。
在 Go 中编写并发代码很容易,我 10 年前写的代码至今编译毫无问题!这就是我绝不会切换的原因。
我的 Go 应用占用内存极少,因此我们可以以极低的成本扩展到大量用户。
对于大型应用,我会使用 postgres(为什么?因为使用 pgfailover 进行复制很容易,高需求的应用需要多个 API 服务器,所以像 postgres 这样的进程外数据库很合适),但我大多数 Web 应用都使用 HTMX,如果需要一些交互性,我就用 React(纯粹是因为工作中有 React 经验)。
对于我们维护的热量追踪应用(免费且无广告),随着用户扩展到数千,我们必须尽可能减少资源消耗:macrocodex(用于根据体重和热量摄入计算维持热量)。我们最初使用的是 Haskell。
后来,开发变得缓慢且繁琐(在 Apple Silicon Mac 上开发并部署到 x64 很痛苦),尽管我很喜欢写 Haskell 代码。我甚至尝试了 nix,结果浪费了一天!当时我需要在 OCaml 和 Rust 之间做选择,我选了 Rust,从此再也没回头。
该算法在 Rust 上的服务时间为 0.1 毫秒。在 Haskell 中是 0.2 毫秒,且内存占用是 Rust 的两倍。还有很多优化……