说实话,两年前让我选 Django 我是拒绝的。当时正拿着 Flask 做点小东西,觉得路由装饰器多清爽,ORM 想怎么写都行,连数据库表都恨不得自己手动建。但后来接了个项目,需要后台管理系统,还要支持用户登录、权限分级、数据审计一堆东西。我花了一晚上把 Flask 的扩展拼在一起,发现插件之间版本兼容性问题一个接一个——尤其那些老掉牙的文档,全是 2016 年的写法,根本不敢用。第二天赌气地试了下 Django,python manage.py startapp 一条命令就把目录切好了,admin 自带登录和增删改查,那一刻我觉得自己前两天的熬夜真有点不值。
用上 Django 后,我第一时间想骂人。settings.py 里 MIDDLEWARE 的排列顺序在文档里写得像诗一样,必须照抄,错一个位置 CSRF 就会神秘失败。我曾经为了自定义用户模型,查了半天资料,最后发现官网说‘如果这是新项目,请从开始就使用自定义用户模型’。可我已经在数据里塞了两万条记录。还有 ORM 的懒加载,配合 Django Debug Toolbar 一看,一个列表页查了 187 条 SQL,其中 184 条都是一模一样的SELECT,我当时真的想把电脑合上。为了把响应时间压到 0.4 秒以内,我把 query 全改成了 select_related 和 prefetch_related,还加了缓存装饰器,SQL 才从 187 条降到 18 条。这只是入门课程级别的坑,却让我对所谓‘开发效率高’产生了严重怀疑。
可后来我又救了几个朋友的项目,才慢慢意识到 Django 的固执是在帮你建立底层防线。比如 ORM 虽然让你不能随心所欲写 SQL,却避免了拼接字符串注入;admin 默认就带有权限模型,配合用户组和分版块授权,做内部系统几乎不写前端;还有迁移操作,每次 makemigrations 都会生成独立文件,回滚到上一版本很容易,不像我一直改 SQL 脚本,最后自己都分不清哪行执行过。现在再看 Django vs Flask 或者 FastAPI,我就不再只看性能了。FastAPI 的异步和 Pydantic 确实很现代,但很多业务系统根本没到那个吞吐量,反而 Django 自带的 session、auth、admin、messages、signals 这些已经足够把我需要的 80% 都粘好了。我甚至开始觉得,Django 的‘魔法’并不是坏设计,只是把你跑偏的可能主动减少,用约束换稳健——当然,前提是你要愿意花时间理解它的底层。
所以如果你现在正纠结要不要从 Flask 迁到 Django,或者刚创建一个项目不知道用什么,我作为走过坑的人建议先回答三个问题:你是不是有大量表格维护、后台管理需求?你是不是团队里有人不喜欢写代码注释却要求人人能接管?你是不是不想天天盯着安全补丁?如果三个里有两个“是”,Django 值得你赌一把。实际落地注意几点:一上来就设 AUTH_USER_MODEL,别用默认;数据库用 PostgreSQL 并调一下 CONN_MAX_AGE(我放在 300 秒);所有以 FK 关联的列表查询,先写 select_related 再说;模板里能用 {% url %} 就别写死路由。最后,Django 不是银弹,但它是一把带护手的长剑,砍完自己再说锋利吧。