logo资料库

django-restful教程.pdf

第1页 / 共68页
第2页 / 共68页
第3页 / 共68页
第4页 / 共68页
第5页 / 共68页
第6页 / 共68页
第7页 / 共68页
第8页 / 共68页
资料共68页,剩余部分请下载后查看
00-前后端分离
01-RESTful-API
02-快速入门
03-序列化
04-序列化高级
05-序列化验证
06-请求和响应
07-类视图
08-认证和权限
09-使用jwt进行认证
10-限制频率
11-版本控制
12-分页
13-解析器
14-视图集和路由器
15-API文档
16-自定义异常
17-自定义返回响应
18-过滤
19-搜索
20-排序
目录 00-前后端分离 01-RESTful-API 02-快速入门 03-序列化 04-序列化高级 05-序列化验证 06-请求和响应 07-类视图 08-认证和权限 09-使用jwt进行认证 10-限制频率 11-版本控制 12-分页 13-解析器 14-视图集和路由器 15-API文档 16-自定义异常 17-自定义返回响应 18-过滤 19-搜索 20-排序 2 4 6 9 13 25 29 32 34 38 45 46 48 50 52 54 55 56 61 66 67
开发模式 在Web 开发模式中,有两种开发模式 • 前后端不分离 • 前后端分离
前后端分离优势 前后端分离缺点 在前后端分离的应用模式中,我们通常将后端开发的每个视图都称为一个接口,或 为什么要有前后端分离 不再控制前端的效果。至于前端用户看到什么效果,从后端请求的数据如何加载到 在前后端不分离模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或 重定向,也就是后端需要控制前端的展示,前端与后端的耦合度很高。 这种应用模式比较适合纯网页应用,但是当后端对接App 时,App 可能并不需要 后端返回一个HTML 网页,而仅仅是数据本身,所以后端原本返回网页的接口不 再适用于前端App 应用,为了对接App 后端还需再开发一套接口。 在前后端分离的应用模式中,后端仅返回前端所需的数据,不再渲染HTML 页面, 前端中,都由前端自己决定,网页有网页的处理方式,App 有App 的处理方式, 但无论哪种前端,所需的数据基本相同,后端仅需开发一套逻辑对外提供数据即可。 在前后端分离的应用模式中 ,前端与后端的耦合度相对较低。 者API,前端通过访问接口来对数据进行增删改查。 • 多端适应 • 前后端开发职责不清 – 模板到低是前端写还是后端写?如果前端写,前端就要懂后端模板语言 – 如果后端写,那么后端就要懂前段html,css,js 甚至更多更多 • 开发效率问题,前后端相互等待 – 前端在写的时候,就希望后端全部写好自己再写 – 后端在写的时候,就希望前端全部写好自己再写 • 前端一直配合着后端,能力受限(搞来搞去写静态页面,天天给后台写模板) • 后台开发语言和模板高度耦合,导致开发语言依赖(一旦用python 开发,以后要 换成java 或者其他语言) • 前后端学习门槛增加(比如后台很多模板语法控制前端展示,但是分离以后,需要 前端自己去实现,增加前端成本,对后台来说,后端要满足规范) • 数据依赖导致文档重要性增加 – 文档是否详细 – 是否及时更新 – 修改要及时通知其他端 • 前端工作量加大 SEO 的难度增加(都是AJAX,像一些初级爬虫全部挡在外面,比如一些搜索引擎, • 这样你的排名就不靠前了)
RESTful API 设计规范 • 域名 应该尽量将API 部署在专用域名之下 https://api.example.com 如果确定API 很简单,不会有进一步扩展,可以考虑放在主域名下。 https://example.com/api/ • 版本 应该将API 的版本号放入URL http://www.example.com/app/1.0/apples http://www.example.com/app/1.1/apples http://www.example.com/app/2.0/apples • 路径 对于一个简洁结构,你应该始终用名词。 此外,利用的HTTP 方法可以分离网址 中的资源名称的操作。 GET /products :将返回所有产品清单 POST /products :将产品新建到集合 GET /products/4 :将获取产品 4 PATCH /products/4 将更新产品 4(部分属性更新) PUT /products/4:将更新产品 4 (全部属性更新) • HTTP 动词 请求方法 请求地址 后端操作 GET /students 获取所有学生 POST /students 增加学生 /students/1 获取编号为1 的学生 GET /students/1 更新编号为1 的学生(全部属性) PUT /students/1 删除编号为1 的学生 DELETE /students/1 更新编号为1 的学生(部分属性) PATCH • 过滤信息 ?limit=10:指定返回记录的数量 ?offset=10:指定返回记录的开始位置。 ?page=2&per_page=100:指定第几页,以及每页的记录数。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进 ?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。 ?animal_type_id=1:指定筛选条件 • 状态码 200 OK - [GET]:服务器成功返回用户请求的数据 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。 202 Accepted - []:表示一个请求已经进入后台排队(异步任务) 204 NO CONTENT - [DELETE]:用户删除数据成功。 行新建或修改数据的操作 401 Unauthorized - []:表示用户没有权限(令牌、用户名、密码错误)。 403 Forbidden - [] 表示用户得到授权(与 401 错误相对),但是访问是被禁止的。 该操作是幂等的。 是只有 XML 格式)。 410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。 错误。 否成功。 • 错误处理 { error:"Invalid API key" } • 返回结果 GET /collection:返回资源对象的列表(数组) GET /collection/resource:返回单个资源对象 POST /collection:返回新生成的资源对象 PUT /collection/resource:返回完整的资源对象 PATCH /collection/resource:返回完整的资源对象 DELETE /collection/resource:返回一个空文档 422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证 404 NOT FOUND - []:用户发出的请求针对的是不存在的记录,服务器没有进行操作, 406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求 JSON 格式,但 500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是
特点 官方文档 源码地址 Django REST framework Django REST framework 框架是一个用于构建Web API 的强大而又灵活的工具. 通 常简称为DRF 框架 或 REST framework 框架. • 提供了定义序列化器serializer 的方法,可以快速根据Django ORM 或者其他库 自动序列化/反序列化; • 提供了丰富的类视图、Mixin 扩展类、简化视图的编写; • 丰富的定制层级: 函数视图、类视图、视图集合到自动生成API,满足各种需求; • 多中身份认证和权限认证方式的支持; • 内置了限流系统; • 直观的API web 界面; • 可扩展性, 插件丰富 https://www.django-rest-framework.org/ https://github.com/encode/django-rest-framework/tree/master 2 INSTALLED_APPS = [ '''''' 'rest_framework' ] class Group(models.Model): name = models.CharField(verbose_name='名字', max_length=100) class Student(models.Model): name = models.CharField(verbose_name='名字', max_length=100) age = models.IntegerField(verbose_name='年龄') group = models.ForeignKey(to=Group, on_delete=models.CASCADE) 在应用下新建一个serializers.py 文件,目的是序列化我们的模型类。 安装 pip install -i https://pypi.douban.com/simple djangorestframework==3.8. 配置 模型类 序列化
视图 from .models import Student,Group from rest_framework import serializers class StudentSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Student fields = ('id', 'name', 'age', 'group') class GroupSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Group fields = ('id', 'name') 我们对数据的增删改查全部包含在viewsets 里面这个类里面了 from .models import Student, Group from rest_framework import viewsets from .serializers import StudentSerializer, GroupSerializer class StudentViewSet(viewsets.ModelViewSet): queryset = Student.objects.all() serializer_class = StudentSerializer class GroupViewSet(viewsets.ModelViewSet): queryset = Group.objects.all() serializer_class = GroupSerializer 通过路由器类注册视图来自动生成API 的URL conf。 from django.contrib import admin from django.urls import path, include from rest_framework import routers from app import views router = routers.DefaultRouter() router.register(r'users', views.StudentViewSet) router.register(r'groups', views.GroupViewSet) urlpatterns = [ path('admin/', admin.site.urls), 路由
path('api-auth/', include('rest_framework.urls', namespace='rest_fr path('', include(router.urls)), amework')) ] http://127.0.0.1:8000/ 运行
分享到:
收藏