ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

4 步跑通你的第一个 Python RESTful 接口

4 步跑通你的第一个 Python RESTful 接口 4 步跑通你的第一个 Python RESTful 接口【免费下载链接】Python-100-DaysPython - 100天从新手到大师项目地址: https://gitcode.com/GitHub_Trending/py/Python-100-Days产品的一句话需求博客要加评论功能。前端已经分离后端只需要提供两个 Python RESTful 接口——拉取评论列表、提交评论。跟着 Python-100-Days 项目 Day46-60 的实战路径我们用 Django REST FrameworkDRF四步做完一个前端能直接用的评论接口。为什么不写getComments、addComment这种网址因为只要约定好“资源用 URI 表示、操作用 HTTP 动词表示”前后端对齐一次约定之后所有接口都能复用这套规则。项目里的DRF 入门讲透了这套约定这里直接上手。从零跑通第一个接口先装 DRF并在 Django 配置里声明它pip install djangorestframeworkINSTALLED_APPS [ ... # 其他应用 rest_framework, ]第一步设计请求路径把“评论”当成资源名列表放/comments/单条放/comments/{id}/操作交给动词区分路径里不放动词。方法路径说明GET/comments/拉取评论列表带分页POST/comments/提交一条新评论DELETE/comments/{id}/删除指定 id 的评论第二步给模型做字段映射模型就四个字段真正要拍板的是暴露哪些给前端——article关联对象太臃肿改传article_id前端要标题时自己去查。模型字段JSON 字段是否必填idid否服务端自动生成article外键article_id是nicknamenickname是contentcontent是pub_datepub_date否服务端自动生成写好序列化器DRF 会自动完成“模型实例 ↔ JSON”的双向转换和入参校验class CommentSerializer(serializers.ModelSerializer): class Meta: model Comment fields (id, article_id, nickname, content, pub_date)生产环境里别图省事写fields __all__全量暴露等于把数据库表结构交给前端看。第三步写第一版视图想代码最少就继承ModelViewSet只声明两件事数据从哪取、谁来序列化。列表、详情、创建、更新、删除五个动作父类都已经写好了。class CommentView(ModelViewSet): queryset Comment.objects.all() serializer_class CommentSerializerfrom rest_framework.routers import DefaultRouter router DefaultRouter() router.register(comments, CommentView) urlpatterns router.urlsDefaultRouter会替你把列表和详情两条路由都生成出来。启动服务浏览器直接打开/comments/能看到 DRF 自带的接口页面直接发请求、查看返回的 JSON还能看到哪些字段必填。第四步挡住不合法的输入⚠️ 第一版必然被“欺负”昵称传空串、评论塞一万字数据库照单全收。在序列化器里加两个validate方法挡住它们。def validate_nickname(self, value): if not value.strip(): raise serializers.ValidationError(昵称不能为空) return value def validate_content(self, value): if len(value) 1000: raise serializers.ValidationError(正文最多1000字) return value校验不通过时 DRF 统一返回 400 和 JSON 错误列表前端判断状态码后展示提示即可不用自己写异常处理。看懂 JWT给接口上锁评论不该匿名提交。HTTP 是无状态的服务器不记得上一个请求是谁发的所以通行做法是让客户端每次请求都携带身份令牌——JWT。流程三步走签发登录成功后服务器把用户 ID 和过期时间写进载荷用密钥算出签名携带前端把令牌存下来每次请求头带上Authorization: Bearer token校验服务器用同一把密钥验签失败或过期就返回 401。签名是对前两部分加密钥算出的指纹中间改一个字符指纹就对不上这就是它难被伪造的原因。签发和校验的核心各只有几行代码用 PyJWTpip install pyjwtimport jwt from datetime import datetime, timedelta def issue_token(user): payload { userid: user.id, exp: datetime.utcnow() timedelta(days1), } return jwt.encode(payload, SECRET_KEY, algorithmHS256)def verify_token(token): try: return jwt.decode(token, SECRET_KEY, algorithms[HS256]) except (jwt.ExpiredSignatureError, jwt.InvalidTokenError): return None # 过期或被篡改一律按未登录处理服务器只验证、不存状态以后加机器扩容也不用同步会话数据。把接口交付给前端接口写完别只甩一句“自己调”。每个接口交一页契约URL、方法、请求字段表、一份真实响应示例错误码说明也别漏前端异常处理才不会靠猜。文档统一维护推荐 RAP2、YAPI 这类工具项目的网络 API 接口设计里有完整示例。DRF 开启分页后列表返回是固定形状前端只需要对齐这一套结构{ count: 35, next: http://api.example.com/comments/?page2, previous: null, results: [ { id: 1, article_id: 7, nickname: 王大锤, content: 写得好, pub_date: 2024-05-01T10:00:00Z } ] }错误响应统一成“400 带字段错误列表、401 未登录、404 资源不存在”前端判断一次就能到处复用。跑通之后可以做的三件事接口迭代多了就先做版本管理路径里加/v1/、/v2/新旧版本互不影响。担心高频刷接口就启用 DRF 自带的限流按用户和 IP 分别设阈值。评论通知、统计这类耗时操作可以接 Celery 异步执行这四步的完整工程见项目 Day54-55代码都在。【免费下载链接】Python-100-DaysPython - 100天从新手到大师项目地址: https://gitcode.com/GitHub_Trending/py/Python-100-Days创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表