-drf-入门规范
一 Web应用模式
在开发Web应用中,有两种应用模式:
1 前后端不分离
2 前后端分离
3 为什么要前后端分离
把前端与后端独立起来去开发,放在两个不同的服务器,需要独立部署。两个不同的工程,两个不同的代码库,不同的开发人员,前后端工程师需要约定交互接口,实现同步开发。开发结束后需要进行独立部署,前端通过接口来调用调用后端的API,前端只需要关注页面的样式与动态数据的解析和渲染,而后端专注于具体业务逻辑。
优势:
- 彻底解放前端。前端不再需要向后台提供模板或是后台在前端HTML中嵌入后台。
- 提高工作效率,分工更加明确。前端只关注前端的事,后台只关心后台的活,两者开发可以同时进行,在后台还没有时间提供接口的时候,前端可以先将数据写死或者调用本地的JSON文件即可,页面的增加和路由的修改也不必再去麻烦后台,开发更加灵活。
- 局部性能提升。通过前端路由的配置,我们可以实现页面的按需加载,无需一开始加载首页便加载网站的所有的资源,服务器也不再需要解析前端页面,在页面交互及用户体验上有所提升。首页这种访问量较大的如上图直接做成静态页面,不需操作数据库,也不必访问应用服务器。
- 降低维护成本。通过目前主流的前端MVC框架,我们可以非常快速的定位及发现问题的所在,客户端的问题不再需要后台人员参与及调试,代码重构及可维护性增强。
- 实现高内聚低耦合,减少后端(应用)服务器的并发/负载压力。
- 即使后端服务暂时超时或者宕机了,前端页面也会正常访问,但无法提供数据。
- 可以使后台能更好的追求高并发、高可用、高性能,使前端能更好的追求页面表现、速度流畅、兼容性、用户体验等。
二 API接口
为了在团队内部形成共识、防止个人习惯差异引起的混乱,我们需要找到一种大家都觉得很好的接口实现规范,而且这种规范能够让后端写的接口,用途一目了然,减少双方之间的合作成本。
通过网络,规定了前后台信息交互规则的url链接,也就是前后台信息交互的媒介
Web API接口和一般的url链接还是有区别的,Web API接口简单概括有下面四大特点
-
url:长得像返回数据的url链接
-
请求方式:get、post、put、patch、delete
- 采用get方式请求上方接口
-
请求参数:json或xml格式的key-value类型数据
- ak:6E823f587c95f0148c19993539b99295
- region:上海
- query:肯德基
- output:json
-
响应结果:json或xml格式的数据
-
上方请求参数的output参数值决定了响应数据的格式
-
数据
-
# xml格式 https://api.map.baidu.com/place/v2/search?ak=6E823f587c95f0148c19993539b99295®ion=%E4%B8%8A%E6%B5%B7&query=%E8%82%AF%E5%BE%B7%E5%9F%BA&output=xml #json格式 https://api.map.baidu.com/place/v2/search?ak=6E823f587c95f0148c19993539b99295®ion=%E4%B8%8A%E6%B5%B7&query=%E8%82%AF%E5%BE%B7%E5%9F%BA&output=json { "status":0, "message":"ok", "results":[ { "name":"肯德基(罗餐厅)", "location":{ "lat":31.415354, "lng":121.357339 }, "address":"月罗路2380号", "province":"上海市", "city":"上海市", "area":"宝山区", "street_id":"339ed41ae1d6dc320a5cb37c", "telephone":"(021)56761006", "detail":1, "uid":"339ed41ae1d6dc320a5cb37c" } ... ] }
-
三 RESTful API规范
REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征性状态转移)。 它首次出现在2000年Roy Fielding的博士论文中。
RESTful是一种定义Web API接口的设计风格,尤其适用于前后端分离的应用模式中。
这种风格的理念认为后端开发任务就是提供数据的,对外提供的是数据资源的访问接口,所以在定义接口时,客户端访问的URL路径就表示这种要操作的数据资源。
事实上,我们可以使用任何一个框架都可以实现符合restful规范的API接口。
总结:
- Representational State Transfer:表征性状态转移
- Web API接口的设计风格,尤其适用于前后端分离的应用模式中
- 与语言、平台无关,任何框架都可以写出符合restful规范的api接口
规范(10条):
-
数据的安全保障:url链接一般都采用https协议进行密文传输
-
接口特征表现:api关键字标识
- https://api.baidu.com/books/
- https://www.baidu.com/api/books/
- 产生接口请求需要相关的所有书籍
-
多版本共存:url链接中标识接口版本
- https://api.baidu.com/v1/books/
- https://api.baidu.com/v2/books/
- url链接中的v1、v2就是不同数据版本的体现(只有在一种数据资源有多版本情况下)
-
接口一般都是完成前后台数据的交互,交互的数据我们称之为资源
-
一般提倡用资源的复数形式,在url链接中奖励不要出现操作资源的动词
-
特殊的接口可以出现动词,因为这些接口一般没有一个明确的资源,或是动词就是接口的核心含义
-
操作资源一般都会涉及到增删查改,我们提供请求方式来标识增删查改
- https://api.baidu.com/books - get请求:获取所有书
- https://api.baidu.com/books/1 - get请求:获取主键为1的书
- https://api.baidu.com/books - post请求:新增一本书书
- https://api.baidu.com/books/1 - put请求:整体修改主键为1的书
- https://api.baidu.com/books/1 - patch请求:局部修改主键为1的书
- https://api.baidu.com/books/1 - delete请求:删除主键为1的书
-
过滤,通过在url上传参的形式传递搜索条件
- https://api.example.com/v1/zoos?limit=10 :指定返回记录的数量
- https://api.example.com/v1/zoos?offset=10 :指定返回记录的开始位置
- https://api.example.com/v1/zoos?page=2&per_page=100:指定第几页,以及每页的记录数
- https://api.example.com/v1/zoos?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序
- https://api.example.com/v1/zoos?animal_type_id=1:指定筛选条件
-
响应状态码
- 正常响应
- 响应状态码2xx
- 200:常规请求
- 201:创建成功
- 响应状态码2xx
- 重定向响应
- 响应状态码3xx
- 301:永久重定向
- 302:暂时重定向
- 响应状态码3xx
- 客户端异常
- 响应状态码4xx
- 403:请求无权限
- 404:请求路径不存在
- 405:请求方式不存在
- 响应状态码4xx
- 服务器异常
- 响应状态码5xx
- 500:服务器异常
- 响应状态码5xx
- 正常响应
-
错误处理(如登录失败的错误信息),返回错误信息
-
返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范
- GET /collection:返回资源对象的列表(数组)
- GET /collection/resource:返回单个资源对象(字典)
- POST /collection:返回新生成的资源对象 (新增后的对象字典)
- PUT /collection/resource:返回完整的资源对象 (修改后的对象字典)
- PATCH /collection/resource:返回完整的资源对象 (修改后的对象字典)
- DELETE /collection/resource:返回一个空文档 ()
-
需要url请求的资源,需要访问资源的请求链接
-
Hypermedia API,RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么
-
{ "status": 0, "msg": "ok", "results":[ { "name":"肯德基(罗餐厅)", "img": "https://image.baidu.com/kfc/001.png" } ... ] }
-
四 Django Rest_Framework
核心思想: 缩减编写api接口的代码
Django REST framework是一个建立在Django基础之上的Web 应用开发框架,可以快速的开发REST API接口应用。在REST framework中,提供了序列化器Serialzier的定义,可以帮助我们简化序列化与反序列化的过程,不仅如此,还提供丰富的类视图、扩展类、视图集来简化视图的编写工作。REST framework还提供了认证、权限、限流、过滤、分页、接口文档等功能支持。REST framework提供了一个API 的Web可视化界面来方便查看测试接口。
特点
- 提供了定义序列化器Serializer的方法,可以快速根据Django ORM或者其它库自动序列化/反序列化;
- 提供了丰富的类视图、Mixin扩展类,简化视图的编写;
- 丰富的定制层级:函数视图、类视图、视图集合到自动生成API,满足各种需求;
- 多重身份认证和权限认证方式的支持;
- 内置了限流系统;
- 直观的API web界面;
- 可扩展性,插件丰富
五 环境安装与配置
DRF需要以下依赖:
- Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6)
- Django (1.10, 1.11, 2.0)
DRF是以Django扩展应用的方式提供的,所以我们可以直接利用已有的Django环境而无需从新创建。(若没有Django环境,需要先创建环境安装Django)
1 安装drf
前提是已经安装了django,建议安装在虚拟环境
# mkvirtualenv drfdemo -p python3
# pip install django
pip install djangorestframework
pip install pymysql
2 创建django项目
cd ~/Desktop
django-admin startproject drfdemo
使用pycharm打开项目,设置虚拟环境的解析器,并修改manage.py中的后缀参数。
3 添加rest_framework应用
在settings.py的INSTALLED_APPS中添加’rest_framework’。
INSTALLED_APPS = [
...
'rest_framework',
]
接下来就可以使用DRF提供的功能进行api接口开发了。在项目中如果使用rest_framework框架实现API接口,主要有以下三个步骤:
- 将请求数据(如json格式)转换为模型类对象(反序列化)
- 根据请求操作数据库
- 将模型类对象转换为响应的数据(如json格式,序列化)
4 执行数据迁移
把students子应用添加到INSTALL_APPS中
初始化数据库连接
安装pymysql
pip install pymysql
主引用中__init__.py
设置使用pymysql作为数据库驱动
import pymysql
pymysql.install_as_MySQLdb()
settings.py配置文件中设置mysql的账号密码
DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# },
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "students",
"HOST": "127.0.0.1",
"PORT": 3306,
"USER": "root",
"PASSWORD":"123",
},
}
终端下,执行数据迁移。
python manage.py makemigrations
python manage.py migrate
错误列表
# 执行数据迁移 python manage.py makemigrations 报错如下:
解决方案:
注释掉 backends/mysql/base.py中的35和36行代码。
# 执行数据迁移发生以下错误:
解决方法:
backends/mysql/operations.py146行里面新增一个行代码: