从0到RESTful API:Python DRF开发RESTful接口的完整快速指南
【免费下载链接】Python-100-DaysPython - 100天从新手到大师项目地址: https://gitcode.com/GitHub_Trending/py/Python-100-Days
Python-100-Days 是一套从 Python 新手到大师的教程项目,其中 Day46-60 章节完整讲解了 RESTful API 开发:一步步带你装好并配置 Django REST Framework(DRF),再完成序列化器、类视图、JWT 认证和分页过滤,最后自己搭出一个可用的 API 服务。
前后端分离为什么逼你学 DRF
以前页面整个由服务端渲染,你不需要关心"接口"这件事。前后端分离之后不一样了:前端只向后台要 JSON,所有数据都得走接口层。没有这层,前端连一个学生姓名都渲染不出来。
💡 把 DRF 理解成"接口层框架"。它基于 Django 构建,JSON 转换、参数校验、权限检查这些脏活累活都由它代劳,你只写业务逻辑。下面以"开发一套学生管理 API"为例走一遍全流程。
URI 怎么写才能让前端不抓狂
REST 的思路其实很朴素:URL 指向"一份数据",HTTP 动词说明"对它做什么"。比如学生列表放在/students/,新增学生发 POST 到/students/,取单个用 GET/students/3/。
更新分两种:全量覆盖用 PUT/students/3/,只改部分字段用 PATCH/students/3/,删除则发 DELETE。记住三条即可:URL 里不放动词(写/deleteStudent就很不 REST)、资源用复数名词、ID 挂在路径末尾。约定写清楚,别人不看代码也能猜到怎么调。
三步装好 DRF 并配置
第一步安装依赖,终端执行pip install djangorestframework即可。第二步在settings.py的INSTALLED_APPS里注册'rest_framework'。第三步配置REST_FRAMEWORK字典:新手期先定两件事就够,默认每页条数和默认权限类,其余项用到再补。
INSTALLED_APPS = [ 'rest_framework', # 注册 DRF 应用 ] REST_FRAMEWORK = { 'PAGE_SIZE': 10, # 列表接口默认每页 10 条 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.SessionAuthentication', ], 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', # 未登录访问直接拒绝 ], }序列化器怎么把模型翻译成 JSON
前端要的是 JSON,你手里是 Python 对象,中间需要"翻译官",它就是序列化器。
最常见的写法是继承ModelSerializer,用内部Meta类声明要处理哪个模型、放出哪些字段。写fields = '__all__'全量输出;想干净点就把字段名一个个列出来,比如只留('id', 'name', 'age')。
序列化器其实是双向的:对象转 JSON 是序列化,JSON 转回受校验的数据是反序列化。想加一条"学生年龄必须年满 18 岁"的业务规则,加一个validate_age方法就行,DRF 会自动调用它拦截非法输入。
函数视图还是类视图?
DRF 写接口有两条路。函数式视图(FBV)是给函数挂上@api_view装饰器,查数据、套序列化器、返回Response,代码完全自由,适合需要特殊处理的接口。
标准增删改查就别手写逻辑了,继承ModelViewSet声明两个属性即可:
class StudentViewSet(ModelViewSet): queryset = Student.objects.all() serializer_class = StudentSerializer两行代码换回创建、列表、按 ID 获取、更新、删除的全套接口,再建一个路由器注册 URL 就能访问。我的建议:CRUD 接口一律用 ViewSet,只有 ViewSet 装不下的定制需求才降级写函数视图。
这是 DRF 自带的浏览器调试页,登录后直接在页面上发请求、看返回,开发期验证字段和数据非常方便。
认证方案怎么选:Session 还是 JWT
浏览器场景下 Session 方案够用:登录成功服务端存会话,前端靠 Cookie 里的 sessionid 关联。但服务端必须保存用户状态,横向扩容加机器时同步 session 很麻烦。
JWT 就是为了解决这个痛点:登录成功时服务端发一枚令牌,内含用户 ID 和过期时间,前端存本地,每次请求放在请求头里带上。令牌由头部、载荷、签名三段组成,签名用服务端密钥算出,任何人篡改都会验签失败。
用 PyJWT 生成和验证令牌只要几行:
import jwt from datetime import datetime, timedelta # 登录成功后签发,有效期一天 payload = {'userid': user.id, 'exp': datetime.utcnow() + timedelta(days=1)} token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')✅ 验证时用同一把密钥解码,验签失败或过期就捕获异常返回 401,前端收到 401 跳登录页。令牌有效期宁可短不可长,重要操作建议二次验证。
分页与过滤的常用配置
列表接口必须分页,否则数据一多前端直接卡死。在全局配置里把'DEFAULT_PAGINATION_CLASS'指到 PageNumber 分页器并设好PAGE_SIZE,所有列表接口自动分页;个别接口想换规则,在视图类上声明pagination_class覆盖即可。
前端需要按条件筛数据、按字段排序时,装django-filter,在视图的filter_backends里加上DjangoFilterBackend,再用filterset_fields声明可筛选的字段。之后前端在查询串里写?major=CS&ordering=age就能用。
🔧 排序字段建议顺手在数据库加索引,不然数据量上来后列表页会越来越慢。
常见坑清单
- 尾斜杠丢了:DRF 路由习惯以斜杠结尾,前端少写一个就是 404。
- 把 PUT 当 PATCH 用:PUT 要求前端给完整对象,只改一个字段请用 PATCH。
- 漏配权限类:上线前逐个检查
permission_classes,接口不能裸奔。 - 令牌有效期过长:JWT 签发后没法主动作废,有效期要短,确实需要踢人下线就再加黑名单校验层。
- 序列化全字段输出:密码、手机号这类敏感字段不该进 API 响应,显式裁剪掉。
想继续深入,去读项目里的 DRF 入门章节 和 DRF 进阶章节,里面有完整的可运行投票项目;接口文档怎么规范书写,可以看 网络API接口设计。
【免费下载链接】Python-100-DaysPython - 100天从新手到大师项目地址: https://gitcode.com/GitHub_Trending/py/Python-100-Days
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考