Drf简介,什么是drf

Drf简介

img

在了解Drf之前先了解几个知识点

web开发模式

混合开发

# 前后端混合开发:
	- 模板的渲染是在后端完成:
    	比如:
            后端: name = 'gary'
            前端: var name = {{ name }}   # 这个name是后端渲染过来的
            # 那么就相当于在前端定义:var name = 'gary'
            
# 这就是前后端混合开发:使用模板语法接收后端传输过来的数据
            
# 这种的做法很乱:js套嵌这模板语法,js在前端执行,模板语法在后端执行。

# 如图:
	前端浏览器请求一个动态页面,动态页面查询需要的数据,查询之后再渲染完,返回一个html页面给前端,这期间模板语法都由后端执行完毕,

前后端分离

# 前后端分离(主流):
 	前端发送请求,后端只处理数据,然后返回一个空页面给前端,前端通过ajax请求,去后端把json格式数据拿出来,然后渲染到页面上返回给用户。
    
# 优势:这样实现前后端分离之后,不仅可以给web端(浏览器)使用,还可以给app,小程序使用,这样再开发app和小程序的时候都使用的是后端处理好的数据,只需要开设一个接口就可以了。

# 前后端交互通信方式:通常为json格式数据

API接口

什么是接口:

# 接口:后端写了一个URL地址,当前端向这个URL地址发送请求时,后端会返回一些json格式数据,前端就可以通过这个url连接拿到这些数据。那么这个URL地址我们就称他为API接口。
# 接口规范:为了在团队内部形成共识,防止个人习惯差异引起的混乱,我们需要找到一种大家都觉得很好的接口实现规范,而且这种规范能够让后端写的接口,用途一目了然,减少双方之间的合作成本。

其实 API接口就是:通过网络,规定了前后端信息规则的url连接,也就是前后端信息交互的媒介。

接口测试工具postman

# 当我们后端写完一堆接口之后,想测试一下接口通不通,向这个接口发送请求看是否会返回数据,这样还要通过写一些代码来测试比较麻烦。我们就借助于接口测试工具来测试这个接口。

# 原理:就是模拟发送http的请求。

# 接口测试工具有很多,这里使用postman接口测试工具。

postman接口测试工具下载地址:https://www.postman.com/downloads/`

安装流程:

# 进入官网下载

# 下载完之后直接双击即可  无需安装。(不存在下一步,安装什么的)
# 默认安装路径为浏览器点击下载的路径。

具体使用:

# 主体功能

# Params

# Headers请求头

# Body请求体 :

# 编码格式详解:https://www.cnblogs.com/garyhtml/p/15980939.html
# 测试结果:

restful规范

restful

REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征性状态转移)。 它首次出现在2000年Roy Fielding的博士论文中。

RESTful是一种定义Web API接口的设计风格,尤其适用于前后端分离的应用模式中。

这种风格的理念认为后端开发任务就是提供数据的,对外提供的是数据资源的访问接口,所以在定义接口时,客户端访问的URL路径就表示这种要操作的数据资源。

事实上,我们可以使用任何一个框架都可以实现符合restful规范的API接口。

# restful规范就是写API接口的规范,大部分的接口,都会按照这个规范去写,相当于web API接口库的设计风格
  • 1、使用https协议传输数据,保证数据安全
# url链接一般都采用https协议进行传输

注:采用https协议,可以提高数据交互过程中的安全性
  • 2、url中带关键字api
# 意义:使别人一看就知道这个url地址是一个api接口
# 比如:
     https://www.baidu.com/api
     https://api.baidu.com
  • 3、url中带版本信息
# 比如:
https://api.baidu.com/v1
https://api.baidu.com/v2

# 作用:比如v1版本的一个功能需要优化,那如果我们只有一个接口的话,这样在修改v1版本的时候,是不是用户就不能使用了。 这时就需要建立另一个接口,这时v1版本用户还可以继续使用,我们只修改v2版本接口,等v2版本上线,v1和v2还都可以使用,只是功能更加优化,这时只通知v2版本的功能优化即可。
  • 4、数据即资源,均使用名词(可复数)
Resource: 一个简单的实例。有一些属性或者一些子资源,子资源可以是一个简单的资源或者一组资源例如:book, user
Collection: 一组同类的资源对象。例如:books, users
    
接口一般都是完成前后台数据的交互,交互的数据我们称之为资源 
# 比如:
    https://api.baidu.com/users
    https://api.baidu.com/books
    https://api.baidu.com/book
        
# 注:一般提倡用资源的复数形式,在url链接中尽量不要出现操作资源的动词,错误示范:https://api.baidu.com/delete-user
# 尽量使用名词来表示,但是这也是无可避免的
    https://api.baidu.com/login
    # 比如登录接口:login那就是动词
    # 但是在表示数据集的时候尽量使用名词来标识
    # 这只是一个规范,尽量使用名词,如果一些功能使用动词来修饰更好,那也无碍。
  • 5、资源的操作由请求方式决定(method)
查询操作  -  get请求
新增操作  -  post请求
修改操作  -  put,patch
删除操作  -  delete

# 这条规范就可以配合上一条规范搭配使用
 - 如果要查询用户数据
    这样就可以向https://api.baidu.com/users接口提交get请求
 - 如果要新增用户数据
    这样就可以向https://api.baidu.com/users接口提交post请求
        
# 这样就在写接口的时候就可以更加的符合使用名词的规范。
	如:增加用户
    	就无需在写动词的形式:
          https://api.baidu.com/set_user/   # 就可以避免编写像这样的形式
                
# 示例解释:
    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请求:获取所有的书
    https://api.baidu.com/books/1   - patch请求:获取所有的书
    https://api.baidu.com/books/1   - delete请求:获取所有的书
  • 6、请求url中携带搜索条件
# 现在这样是拿到所有的书,但是我不想要拿所有的书,这时就要添加一些搜索条件。
https://api.baidu.com/books   	- get请求:获取所有的书
    
# 比如分页效果:
# 示例解释:
    https://api:example.com/v1/zoos/?limit=10    # 指定返回记录的数量
    https://api:example.com/v1/zoos/?offset=10    # 指定返回记录的开始位置
  • 7、响应中携带状态码(可指定自定义状态码)
# 可自定义状态码:
{
    status:200
}

# 状态码:
200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

  • 8、响应结果当中带错误信息
# 错误处理,应返回错误信息,error当做key。通常和自定义状态码配合使用
例:
{
    status:1000,
    msg:'错误提示信息'
}

# 这是响应给前端的报错信息格式 
  • 9、返回结果,遵循的规范
GET /collection:		    # 查询所有资源的话:返回资源对象的列表(数组)
GET /collection/resource:	# 查询单个资源的话:返回单个资源对象
POST /collection:		    # 新增数据:返回新生成的资源对象
PUT /collection/resource:	# 修改数据:返回完整的修改后的资源对象
PATCH /collection/resource: # 修改数据:返回完整的修改后的资源对象
DELETE /collection/resource:# 删除数据:返回一个空文档
  • 10、返回数据中带连接地址
# Hypermedia API,RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。

#  示例演示:

{"link": {
  "rel":   "collection https://www.example.com/zoos",
  "href":  "https://api.example.com/zoos",
  "title": "List of zoos",
  "type":  "application/vnd.yourformat+json"
}}

上面代码表示,文档中有一个link属性,用户读取这个属性就知道下一步该调用什么API了。rel表示这个API与当前网址的关系(collection关系,并给出该collection的网址),href表示API的路径,title表示API的标题,type表示返回类型。

Hypermedia API的设计被称为HATEOAS。Github的API就是这种设计,访问api.github.com会得到一个所有可用API的网址列表。

{
  "current_user_url": "https://api.github.com/user",
  "authorizations_url": "https://api.github.com/authorizations",
  // ...
}

从上面可以看到,如果想获取当前用户的信息,应该去访问api.github.com/user,然后就得到了下面结果。

{
  "message": "Requires authentication",
  "documentation_url": "https://developer.github.com/v3"
}

四 、序列化与反序列化

api接口开发,最核心最常见的一个过程就是序列化,所谓序列化就是把数据转换格式,序列化可以分两个阶段:

序列化: 把我们识别的数据转换成指定的格式提供给别人。

例如:我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前端或别的平台使用,所以我们需要把数据进行序列化,变成字符串或者json数据,提供给别人。

反序列化:把别人提供的数据转换/还原成我们需要的格式。

例如:前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,这样我们才能把数据保存到数据库中。

Django Rest_Framework

drf_logo

核心思想: 缩减编写api接口的代码

Django REST framework是一个建立在Django基础之上的Web 应用开发框架,可以快速的开发REST API接口应用。在REST framework中,提供了序列化器Serialzier的定义,可以帮助我们简化序列化与反序列化的过程,不仅如此,还提供丰富的类视图、扩展类、视图集来简化视图的编写工作。REST framework还提供了认证、权限、限流、过滤、分页、接口文档等功能支持。REST framework提供了一个API 的Web可视化界面来方便查看测试接口。

官方文档:https://www.django-rest-framework.org/

github: https://github.com/encode/django-rest-framework/tree/master

drf简介与安装

#  Django Rest_Framework 简称 :drf
#  drf其实就是django的一个app,可以借助它快速在django框架开发出符合restful规范的接口
#  提供了:REST framework还提供了认证、权限、限流、过滤、分页、接口文档等功能支持
#  官方文档:https://www.django-rest-framework.org/

特点:

  • 提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;
  • 提供了丰富的类视图、Mixin扩展类,简化视图的编写;
  • 丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;
  • 多种身份认证和权限认证方式的支持;[jwt]
  • 内置了限流系统;
  • 直观的 API web 界面;
  • 可扩展性,插件丰富

安装:

# 注:drf最新版是不支持django1.x版本的,如果安装使用的是1.x版本的,那么安装最新版drf时,会自动将django升级为最新版本。

# 命令行创建:
	pip3 install djangorestframework
# 创建最新drf需要和django版本对应好

添加rest_framework应用

# 我们知道drf是django的一个app所以我们需要注册他
# 不然在浏览器是访问不到的,(在测试软件postman可以访问)
# 在settings.py的INSTALLED_APPS中添加’rest_framework’

INSTALLED_APPS = [
    ...
    'rest_framework',
]
posted @ 2022-04-22 23:26  JasonBorn  阅读(529)  评论(0编辑  收藏  举报