news 2026/8/28 11:44:49

Python-100-Days:3 步搭好一个规范 RESTful API,DRF 全流程实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python-100-Days:3 步搭好一个规范 RESTful API,DRF 全流程实战

Python-100-Days:3 步搭好一个规范 RESTful API,DRF 全流程实战

【免费下载链接】Python-100-DaysPython - 100天从新手到大师项目地址: https://gitcode.com/GitHub_Trending/py/Python-100-Days

刚学完 Python 基础、第一次接后端 API 需求时,RESTful 架构、序列化器、JWT 这些词很容易让人发懵。这篇文章基于 Python-100-Days 项目的 DRF 章节,用"评论系统"这个真实业务场景带你把接口从零跑通:配好环境、设计好接口、接入认证,三步走完就能交付一套规范的 RESTful API。

业务场景:给内容社区加一套评论接口

先说需求:你负责的内容社区要上线评论功能,前端需要一个接口拉评论列表、发新评论、删除违规评论。这类需求别把逻辑写死在页面里,抽成 API 后网页、App、小程序多端能直接复用同一套数据。下面按"能跑起来 → 设计清楚 → 安全闭环"的顺序推进。

5 分钟环境搭建:DRF 最小可用全局配置

DRF 是 Django 生态里做 RESTful API 的事实标准,装完加两段配置就能开工。

pip install djangorestframework
# settings.py INSTALLED_APPS = [ # ...其余应用省略 'rest_framework', ] REST_FRAMEWORK = { 'PAGE_SIZE': 10, 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.TokenAuthentication', 'rest_framework.authentication.SessionAuthentication', ], 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', ] }

全局默认权限设成IsAuthenticated,意味着每个接口默认都要登录,后续想放行某个接口再单独覆盖,比默认全公开安全得多。项目跑起来后,浏览器直接访问接口 URL,DRF 会给你一个可视化调试页,发请求、看响应不用切 Postman:

RESTful 接口命名规范:URI 是名词,动词交给 HTTP

写代码前先定好接口,这是新手和熟手的第一个分水岭。命名只有一条口诀:URI 只放名词,动作由 HTTP 方法表达

方法路径语义
GET/api/orders/拉取订单列表
POST/api/orders/创建新订单
GET/api/orders/{id}/查询单个订单
PUT/api/orders/{id}/全量更新订单
PATCH/api/orders/{id}/局部更新订单
DELETE/api/orders/{id}/删除订单

对比一下/getOrderList/deleteOrder这类写法:后者把动作塞进了 URL,方法语义丢失,前端调用也没法遵循统一约定。子资源同理,嵌套一层即可,比如GET /api/orders/{id}/comments/表示"某订单的评论列表"。

序列化器:模型到 JSON 的翻译官

模型对象不能直接丢给前端,序列化器负责双向翻译:出方向把Order实例变成 JSON,进方向把请求体校验回合法数据。用ModelSerializer只写 4 行核心代码,字段校验方法会自动被框架调用:

from rest_framework import serializers from .models import Order class OrderSerializer(serializers.ModelSerializer): class Meta: model = Order fields = ('id', 'amount', 'product_name', 'created_at') def validate_amount(self, value): if value <= 0: raise serializers.ValidationError('订单金额必须大于 0') return value

💡 注意validate_字段名的命名约定——框架看到请求体里有amount就会调这个方法,抛出的ValidationError自动转成 400 响应,异常处理不用你操心。

视图选型:ModelViewSet 5 行代码搞定全套 CRUD

常规增删改查优先用ModelViewSet,五个动作(列表、详情、创建、更新、删除)它全部内置,你只需声明数据从哪来、怎么序列化:

from rest_framework.viewsets import ModelViewSet class OrderViewSet(ModelViewSet): queryset = Order.objects.all() serializer_class = OrderSerializer permission_classes = [IsAuthenticated]

再配合路由器完成 URL 映射:

from rest_framework.routers import DefaultRouter router = DefaultRouter() router.register('api/orders', OrderViewSet) urlpatterns += router.urls

什么时候用基于函数的视图(FBV)?当你需要完全自定义请求处理流程、返回结构和 DRF 的默认套路不一致时,用@api_view装饰普通函数更自由。但 90% 的常规 CRUD,ViewSet 一行逻辑都不用写,别重复造轮子。

JWT 令牌认证流程:登录发一次,请求带一路

先看完整闭环:登录成功 → 服务端签发令牌 → 前端本地存储 → 之后每次请求携带令牌 → 服务端验签放行或拒绝

图里 Client、Authorization Server、Resource Server 三者间的 A~F 六步,本质就是"先找认证方换令牌,再拿令牌找资源方要数据"。放到你的项目里:登录接口就是认证方,订单、评论接口都是资源方。

生成令牌(登录成功后执行):

import jwt from datetime import datetime, timedelta def generate_token(user): payload = { 'userid': user.id, 'exp': datetime.utcnow() + timedelta(days=1), } return jwt.encode(payload, settings.SECRET_KEY, algorithm='HS256')

校验令牌(受保护接口入口处执行):

def verify_token(token): try: return jwt.decode(token, settings.SECRET_KEY, algorithms=['HS256']) except jwt.ExpiredSignatureError: return None # 令牌过期,返回 401 让前端重新登录 except jwt.InvalidTokenError: return None # 无效令牌,同样拒绝

两个高频坑 ⚠️:

  1. jwt.decode必须显式传algorithms参数,新版本 PyJWT 不传会直接报错,这是安全加固。
  2. 过期和无效要分开捕获,前端拿到 401 能区分"去重新登录"还是"检查请求头"。

另外记住:JWT 在过期前无法主动作废,所以有效期别设太长,敏感操作(如改密码)要二次验证。

上线前检查:接口文档必含 4 项,过滤分页一步到位

接口写完不算完,前端拿到文档才能开工。每个接口的文档必须包含 4 项,缺一不可:

  1. 接口 URL 和请求方法
  2. 参数说明:类型、位置(路径/查询/请求体/请求头)、是否必填
  3. 响应体示例(成功和失败各一份)
  4. 错误码说明:401 未登录、403 无权限、404 不存在分别对应什么场景

列表接口的过滤和排序交给django-filter,在 ViewSet 上加三行属性:

class OrderViewSet(ModelViewSet): queryset = Order.objects.all() serializer_class = OrderSerializer filter_backends = [DjangoFilterBackend, OrderingFilter] filterset_fields = ['status'] ordering_fields = ['created_at', 'amount']

这样?status=paid&ordering=-created_at这类查询参数自动生效。分页更省事:第二节全局配置里已经写好了PAGE_SIZE,所有列表接口自动返回分页结构,不需要逐个接口处理。

📌 完整接口文档的规范写法(含全局状态码约定、参数表格模板),可以对照 Day91-100/94.网络API接口设计.md 补全。

延伸路线

  • API 版本控制:URL 里带/api/v1/前缀,接口破坏性变更时新旧版本并存。
  • 限流:用 DRF 内置 Throttle 按用户 + IP 维度控制请求频率。
  • 异步任务:发通知、生成报表这类耗时操作丢给 Celery。
  • 性能监控:记录每个请求的耗时和状态码,慢接口和 5xx 才能被及时发现。
  • 继续深入:Day46-60/54.RESTful架构和DRF入门.md 里有基于 token 的完整登录实现可对照阅读。

【免费下载链接】Python-100-DaysPython - 100天从新手到大师项目地址: https://gitcode.com/GitHub_Trending/py/Python-100-Days

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/28 11:44:44

蓝桥杯算法核心:树遍历原理、应用场景与高频题型解析

1. 从一道题到一类题&#xff1a;为什么“树的遍历”是蓝桥杯的必考点&#xff1f; 如果你刷过蓝桥杯的历年真题&#xff0c;或者正准备参加比赛&#xff0c;大概率会和我有同样的感觉&#xff1a;怎么又是树&#xff1f;怎么又是遍历&#xff1f;从省赛到国赛&#xff0c;从填…

作者头像 李华
网站建设 2026/8/28 11:43:56

Nordic BLE SoC可穿戴追踪器开发:从选型、低功耗设计到量产排障

做可穿戴追踪器这个方向&#xff0c;圈子里聊到BLE芯片时大概率绕不开Nordic。不管是运动手环、老人防走丢胸牌、宠物追踪器&#xff0c;还是工牌式考勤终端&#xff0c;几乎都能看到nRF系列SoC的身影。最初我接触这个领域时也有点疑惑&#xff1a;市面上能跑BLE的方案并不少&a…

作者头像 李华
网站建设 2026/8/28 11:42:28

基于参数模型的点云滤波:从RANSAC原理到工程实践

1. 项目缘起&#xff1a;从“点云海洋”到“清晰世界” 做3D激光雷达开发的朋友&#xff0c;尤其是搞感知算法或者机器人定位的&#xff0c;肯定都经历过这个阶段&#xff1a;拿到一帧原始点云数据&#xff0c;密密麻麻几十万甚至上百万个点&#xff0c;乍一看信息量巨大&#…

作者头像 李华
网站建设 2026/8/28 11:40:17

如何验证 AI 技能好不好用:一套评估系统完整实战指南

如何验证 AI 技能好不好用&#xff1a;一套评估系统完整实战指南 【免费下载链接】skills Public repository for Agent Skills 项目地址: https://gitcode.com/GitHub_Trending/skills3/skills 你刚写完一组 MCP 工具&#xff0c;让大模型去调用&#xff0c;看起来&quo…

作者头像 李华
网站建设 2026/8/28 11:38:50

LMCache命中率98%却返回zeros?KV Cache正确性验证指南

一个看起来自相矛盾的现象最近在 LLM 推理服务群里被反复讨论&#xff1a;缓存层上报的 cache hit rate 高达 98%&#xff0c;几乎每个请求的前缀 KV Cache 都“命中”了&#xff0c;但模型最终返回给下游的却是空输出&#xff0c;或者在一串代表失败/缺省的“0”上打转。很多人…

作者头像 李华
网站建设 2026/8/28 11:38:48

云端视频生成与本地部署:从API接入到工程化落地的完整指南

Seedance 这类云端视频生成模型最近讨论度很高&#xff0c;相关赛道里的融资消息也在变多&#xff0c;很多团队开始重新评估&#xff1a;到底该继续把视频生成任务跑在云端&#xff0c;还是引入本地部署和中间层方案。我先说结论&#xff1a;云端方案适合快速验证和低频使用&am…

作者头像 李华