封面图

破防瞬间:那个被手写 JSON 逼疯的深夜

早安,我是 Lyra。

今天上海的天气有点阴郁,气温只有 4 度,窗外的梧桐树秃得只剩下几根倔强的枝丫。这种天气,如果不来一块刚出炉的肉桂甜甜圈配热美式,简直是对灵魂的虐待。☕️🍩

就在刚才啃甜甜圈的时候,我在技术群里看到一个新入行的小友在哀嚎:“为什么要用框架?我自己写 json.dumps() 难道不香吗?”

我看着屏幕,手里拿着甜甜圈停在半空,嘴角忍不住抽搐了一下。

香?真的很香吗?

我想起了几年前那个不堪回首的项目。那时候年轻气盛,觉得框架都是累赘,非要搞什么“轻量级微内核”。结果呢?为了处理一个简单的用户注册接口,我不得不手动写代码去验证邮箱格式、去判断用户名是否重复、去处理 datetime 对象无法被 JSON 序列化的报错,甚至还得自己写一堆丑陋的 try...except 来捕获数据库异常。

最崩溃的是,当前端跑过来问我:“Lyra,这个接口的返回值为什么有时候是驼峰,有时候是下划线?”那一刻,我看着那一坨意大利面条般的代码,只想把键盘吃下去。

我们总是高估了自己的耐心,却低估了业务逻辑的复杂度。

直到后来,我遇到了 Django REST framework (DRF)

那一刻的真香定律,就像今早这口甜甜圈一样,甜腻,扎实,充满了罪恶的满足感。它不是那个跑得最快的法拉利,但它是那个能帮你挡住所有枪林弹雨的重型坦克。

暴力美学:DRF 的“重装甲”哲学

在这个言必称“异步”、“高并发”、“微服务”的浮躁年代,DRF 显得像个格格不入的老绅士。

很多人嫌弃它重。没错,它确实重。但它的重,是一种**“暴力美学”**。

1. 降维打击的“可浏览 API” (Browsable API)

这是 DRF 最让竞品(比如 FastAPI)眼红,却很难完美复刻的功能。

当你部署好 DRF 后,访问你的 API 地址,你看到的不是冷冰冰的 JSON 字符串,而是一个全功能的 Web 页面。你可以在这里直接进行 GET、POST、PUT、DELETE 操作。

  • 开发者体验拉满:后端改了接口,不需要去 Postman 里改参数,直接甩个链接给前端:“你自己上去点一下试试。”
  • 调试神器:权限对不对?过滤器生效没?不用写 curl 命令,点一下按钮全都有。

Screenshot
[图注:这哪里是 API 文档,这分明是后端工程师的“免战牌”。前端再问参数传得对不对,直接把截图甩过去,优雅且致命。]

2. 序列化器 (Serializers):数据的“翻译官”与“安检员”

如果说 View 是大脑,那 Serializer 就是 DRF 的心脏。它不仅负责把 Python 的复杂对象(比如 Django 的 Model 实例、QuerySet)转换成 JSON,更重要的是它负责反序列化

它能自动处理:

  • 数据验证:字段必填、长度限制、唯一性校验……不需要你写一行 if
  • 复杂关系:外键、多对多关系,通过简单的配置就能变成嵌套的 JSON 结构。

这不仅仅是省代码,这是在保命。它强迫你把数据清洗逻辑和业务逻辑分离开来,治好了我多年的代码洁癖强迫症。

抄作业时间:十分钟构建工业级 API

好了,情怀讲完,现在是**“摸鱼指南”**时间。

如果你手头有一个现成的 Django 项目,想快速给移动端或者小程序出接口,别犹豫,DRF 是唯一的真神。

1. 环境准备

假设你已经装好了 Python 3.10+ 和 Django。只需要一行命令:

pip install djangorestframework

别忘了在 settings.py 里把它请进门:

INSTALLED_APPS = [
    # ... 你的其他 App
    "rest_framework",
]

2. 核心代码块:三步走

我们以最常见的“用户管理”为例。请注意,这里我们要展示的是 DRF 最核心的ViewSetsRouters 组合拳。

步骤一:定义序列化器 (serializers.py)

from django.contrib.auth.models import User
from rest_framework import serializers

class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ['url', 'username', 'email', 'is_staff']

步骤二:定义视图集 (views.py)

from django.contrib.auth.models import User
from rest_framework import viewsets
from .serializers import UserSerializer

class UserViewSet(viewsets.ModelViewSet):
    """
    允许用户查看或编辑的 API 端点。
    """
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer

步骤三:自动路由 (urls.py)

from django.urls import path, include
from rest_framework import routers
from . import views

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)

urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

3. 代码显微镜 (Lyra 的独家批注) 🔬

咱们不能只扔代码不讲道理。来,拿好放大镜,这几行代码里全是细节:

  • HyperlinkedModelSerializer: 注意到了吗?我用的不是普通的 ModelSerializer。这个高级货会自动把外键关系变成 URL 链接(比如 "url": "http://.../users/1/"),而不是干巴巴的 ID。这完全符合 RESTful 的 HATEOAS 原则(虽然名字很难读,但很高级)。这意味着前端顺着链接就能爬取整个 API 图谱,非常优雅。
  • viewsets.ModelViewSet: 这是一个魔法盒子。你只写了两行代码,但它背地里帮你实现了:list (列表), create (创建), retrieve (详情), update (更新), partial_update (局部更新), destroy (删除)。一共 6 个接口!如果你手写,至少得 100 行代码起步。
  • router.register: 这是路由自动生成的逻辑。它会根据 ViewSet 里的动作,自动帮你生成 /users//users/{id}/ 的 URL 规则。从此告别写 re_path 正则表达式的噩梦。

4. 避坑指南 (Lyra 亲测踩雷) 💣

作为过来人,必须告诉你们两个新手最容易掉进去的坑,希望能帮你们今晚准时下班:

  1. 坑一:CSRF 的幽灵
    如果你在浏览器里测试 POST 请求一切正常,但用 Postman 或者前端调用时报错 403 Forbidden: CSRF token missing,别慌。这是因为 DRF 默认使用了 SessionAuthentication
    解法:在生产环境的 API 设置中,通常需要配置 TokenAuthenticationJWT,并把 Session 认证仅用于开发调试。
  2. 坑二:N+1 查询的诅咒
    当你序列化一个包含外键的对象列表时(比如文章列表包含作者信息),DRF 默认会傻傻地遍历每一篇文章去查询一次作者表。100 篇文章就是 101 次查询,数据库直接炸裂。
    解法:在 get_queryset 方法中,务必使用 select_relatedprefetch_related
    # ❌ 错误示范
    queryset = Article.objects.all()
    # ✅ 正确示范 (数据库狂喜)
    queryset = Article.objects.select_related('author').all()
    

人间清醒:在 FastAPI 横行的时代,它凭什么活着?

既然 FastAPI 那么快,代码那么现代化(Type Hints),我们为什么还要抱着 DRF 不放?

因为“快”不仅仅是指运行速度,更是指“交付速度”。

如果你的项目已经深度绑定了 Django 的 ORM,或者你需要利用 Django Admin 快速构建后台管理系统,那么 DRF 是无可替代的。

  • 生态位差异:FastAPI 是特种兵,适合微服务、高并发、AI 推理接口,拿着冲锋枪突突突。DRF 是集团军,适合构建复杂的企业级业务系统、SaaS 平台、内容管理系统。
  • 安全性:DRF 经过了十几年的打磨,各种边缘情况(Edge Cases)、安全漏洞都已经修补得差不多了。它的权限系统(Permissions)粒度之细,简直令人发指。对于金融、政企类项目,“稳”就是最大的“快”

它不是银弹。它有历史包袱,它在 async 支持上步履蹒跚。但在 2026 年的今天,当你需要构建一个这就需要上线、这就需要鉴权、这就需要管理后台的项目时,它依然是那个最值得信赖的常数

写在最后:致那些“守旧”的代码手艺人

写到这里,我的甜甜圈已经吃完了,手指上还沾着糖霜。

在这个技术迭代快得像翻书一样的时代,我们很容易陷入一种“版本焦虑”。看到这就想学,看到那也被安利。但真正的高手,往往不是那些精通所有新框架的人,而是那些知道在什么场景下,用什么工具最趁手的人。

DRF 就像家里那口用了十年的铸铁锅。它不粘涂层可能脱落了,它很沉,单手颠不动。但你知道,只要把它架在火上,它就能炖出一锅最入味、最软烂的红烧肉。

这种踏实感,是任何轻量级框架都给不了的。

最后聊聊:
在你的技术栈里,有没有哪一款工具,虽然老旧、笨重,但你依然舍不得把它换掉?
评论区里,咱们从诗词歌赋聊到 StackOverflow

我是 Lyra,咱们下期见。✨


📚 引用与项目地址 (References)

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐