手把手搭 RESTful API:用 DRF 给业务系统开放接口实战 手把手搭 RESTful API用 DRF 给业务系统开放接口实战【免费下载链接】Python-100-DaysPython - 100天从新手到大师项目地址: https://gitcode.com/GitHub_Trending/py/Python-100-Days假设你要给一套校园选课系统补数据出口管理后台要拉取课程和教师列表移动端要查学生档案。总不能为每块屏幕各写一套 HTML 吧正确的做法是把数据按 RESTful 风格暴露成一组标准接口让所有客户端共用同一套数据源。这正是 Python-100-Days 里 Django REST Framework下称 DRF章节解决的问题。你可以把 REST 理解成给数据资源定的一套点菜规则菜名URI唯一动作HTTP 方法固定——浏览菜单是查询下单是新建改单是更新退菜是删除。规则定了前端、App、小程序谁来点菜都听得懂。5 分钟跑通第一个接口装包、三行配置、一个视图最短路径只有四步全程不超过 5 分钟。第 1 步装包。pip install djangorestframework第 2 步在 settings.py 里注册应用。INSTALLED_APPS [ rest_framework, # ... 其余应用省略 ... ]第 3 步写一个能返回 JSON 的视图。from rest_framework.decorators import api_view from rest_framework.response import Response from .models import Subject api_view([GET]) def show_subjects(request): subjects Subject.objects.all().order_by(no) return Response(SubjectSerializer(subjects, manyTrue).data)第 4 步挂上 URL启动服务。# urls.py一行即可 path(api/subjects/, show_subjects),浏览器打开http://127.0.0.1:8000/api/subjects/你会看到一个 DRF 自带的调试页面上面直接展示返回的 JSON看到这里一个接口就算跑起来了。注意一个新手最容易踩的雷api_view视图必须返回 DRF 的Response而不是 Django 原生的HttpResponse否则浏览器里那个漂亮的调试页面不会出现直接吐裸数据。 提示这个调试页面不只是好看它还能手工发 POST/PUT 请求联调期能顶半个 Postman。拆解 DRF 的四个零件序列化器、视图、认证、分页过滤跑通之后别急着堆接口先把 DRF 拆成四个零件看清楚后面写什么都快。零件一序列化器——Python 对象和 JSON 之间的翻译官它解决什么问题。数据库里的模型对象不能直接塞进 HTTP 响应总得有人翻译成前端认识的 JSON。序列化器Serializer就是干这个的而且它是双向的出参时把对象翻成 JSON入参时把 JSON 翻回对象并顺带做校验。怎么用。继承ModelSerializer指定模型和字段即可class StudentSerializer(serializers.ModelSerializer): class Meta: model Student fields (id, name, age) def validate_age(self, value): # 入参校验钩子 if value 18: raise serializers.ValidationError(年龄必须大于18岁) return value常见坑。图省事写fields __all__结果把密码、手机号这些敏感字段也吐给了前端。字段列表一定要显式声明少给永远比给多了再删安全。零件二视图——一行 ViewSet 顶五个视图函数它解决什么问题。一个资源的增删改查用函数视图得写五段几乎一样的逻辑。怎么用。直接上ModelViewSet配合router注册五个接口一次配齐class StudentViewSet(ModelViewSet): queryset Student.objects.all() serializer_class StudentSerializer # urls.py router DefaultRouter() router.register(rstudents, StudentViewSet) # 生成 /students/ 和 /students/{id}/路由生成后方法语义天然贴合 RESTGET列表与详情、POST创建、PUT全量更新、PATCH局部更新、DELETE删除动词和 URI 各管各的谁也不用越位。这也是我直接推荐 ViewSet 而不建议你纠结函数视图还是类视图的原因——它把惯例固化了新人不会写歪。常见坑。只给queryset不配权限等于接口裸奔或者手动调用了 Django 原生的HttpResponse绕过了 DRF 的解析器。⚠️ 注意DRF 视图里永远用Response返回数据别混用 Django 原生的响应对象。零件三认证与权限——默认把门关上它解决什么问题。REST 接口天生不记人——服务器不存会话每个请求都得自己带身份证。认证Authentication负责你是谁权限Permission负责你能不能干。怎么用。在 settings.py 里设全局默认值之后所有接口自动生效REST_FRAMEWORK { DEFAULT_AUTHENTICATION_CLASSES: [ rest_framework.authentication.TokenAuthentication, rest_framework.authentication.SessionAuthentication, ], DEFAULT_PERMISSION_CLASSES: [ rest_framework.permissions.IsAuthenticated, ], }常见坑。开发期嫌登录麻烦全局权限写AllowAny然后忘了改上线即事故。宁可开发时走 Session 认证登录一次就行也别全局放开。零件四分页与过滤——别让列表接口拖垮数据库它解决什么问题。queryset全量加载在生产环境等于自杀前端要的往往是第 3 页、按年龄排、只要计算机专业的。怎么用。全局分页两行配置过滤和排序挂在 ViewSet 上REST_FRAMEWORK { DEFAULT_PAGINATION_CLASS: rest_framework.pagination.PageNumberPagination, PAGE_SIZE: 10, } # StudentViewSet 内追加 filter_backends [DjangoFilterBackend, OrderingFilter] filterset_fields [major] # 支持 ?majorcs ordering_fields [age, no] # 支持 ?ordering-age过滤功能来自django-filter包记得pip install django-filter。 提示分页不是可选项是列表接口的出厂配置。上线前必做的四件事JWT 认证、缓存、过滤排序、接口文档本地跑通只是热身真要交付按下面这份清单过一遍。1. 把认证升级为 JWT。JWT 本质是一个自包含的带签名凭证里面装着用户标识和过期时间外面套一层只有服务器知道的签名服务端验签即可确认身份不用存任何会话状态加机器扩容毫无压力。# 登录成功后签发 payload {userid: user.id, exp: datetime.utcnow() timedelta(days1)} token jwt.encode(payload, settings.SECRET_KEY).decode() # 每次请求验签失败即 401 data jwt.decode(token, settings.SECRET_KEY) # 抛异常则拒绝PyJWT 安装命令是pip install pyjwt。2. 给读多写少的接口加缓存。课程目录、教师名录这类几乎不变的数据缓存 15 分钟能挡掉绝大多数数据库压力from django.utils.decorators import method_decorator from django.views.decorators.cache import cache_page method_decorator(cache_page(60 * 15), namelist) class SubjectViewSet(ModelViewSet): ...3. 过滤排序别偷懒。上一条清单里讲过的filterset_fields和ordering_fields要真正落到 ViewSet 上前端列表页的筛选框全靠它们。4. 文档交给工具自动生成。别再手写接口表格了前后端联调时手写文档永远滞后。上 drf-spectacular一条配置就能自动生成 OpenAPI/Swagger 文档模型一变文档跟着变。项目里的 94.网络API接口设计 也强调过同样的思路文档要能跟上代码。⚠️ 注意缓存、限流、文档这三样上线当天补的成本远高于开发期顺手补的成本。接下来可以往这些方向挖到这里一个能返回 JSON、带认证分页、有文档的 DRF 接口已经立住了。再往前这些方向值得逐个击破继续 Day46-60/55.RESTful架构和DRF进阶 的投票项目实战把 ViewSet 的钩子方法perform_create、get_queryset玩熟研究 JWT 的失效难题令牌签发后过期前无法作废黑名单、短有效期加刷新令牌是两种主流解法把序列化器、过滤、认证组合起来独立设计一套完整的图书管理 API用 Docker 把服务打包项目 Day91-100 有专门的容器章节体验接口写对到部署跑稳之间的最后一公里【免费下载链接】Python-100-DaysPython - 100天从新手到大师项目地址: https://gitcode.com/GitHub_Trending/py/Python-100-Days创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考