django restful framework —— Drf 规范一

一 Web应用模式

在开发Web应用中,有两种应用模式:

前后端混合开发(前后端不分离):返回的是html的内容,需要写模板(模板语法)
前后端分离:只专注于写后端接口,返回json,xml格式数据

# xml格式
<xml>
<name>lqz</name>
</xml>
# json
{"name":"lqz"}

# java---》jsp
https://www.pearvideo.com/category_loading.jsp
#php写的
http://www.aa7a.cn/user.php
# python写的
http://www.aa7a.cn/user.html

#什么是动态页面(查数据库的),什么是静态页面(静止的html)
#页面静态化
静态页面:不用与数据库交互的,已经存在的,不变的
动态页面:要从数据库获取数据,然后,渲染页面

1.1 前后端不分离

前后端不分离

1.2 前后端分离

前后端分离

二 API接口

统一规范,减少合作成本

#百度地图的api接口 
https://api.map.baidu.com/place/v2/search?ak=6E823f587c95f0148c19993539b99295&region=%E4%B8%8A%E6%B5%B7&query=%E8%82%AF%E5%BE%B7%E5%9F%BA&output=xml

通过网络,规定了前后台信息交互规则的url链接,也就是前后台信息交互的媒介

Web API接口和一般的url链接还是有区别的,Web API接口简单概括有下面四大特点

  • url:长得像返回数据的url链接

  • 请求方式:get、post、put、patch、delete

  • 请求参数:json或xml格式的key-value类型数据

    • ak:6E823f587c95f0148c19993539b99295
    • region:上海
    • query:肯德基
    • output:json
  • 响应结果:json或xml格式的数据

    • output请求参数:响应数据的格式
# xml格式
https://api.map.baidu.com/place/v2/search?ak=6E823f587c95f0148c19993539b99295&region=%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&region=%E4%B8%8A%E6%B5%B7&query=%E8%82%AF%E5%BE%B7%E5%9F%BA&output=json

三 接口测试工具:Postman

Postman是一款接口调试工具,是一款免费的可视化软件,同时支持各种操作系统平台,是测试接口的首选工具。

Postman可以直接从官网:https://www.getpostman.com/downloads/下载获得,双击自动安装。

get请求:请求参数在 request.query_params中

post请求:请求数据在 body 中

ps:解析json的网站 http://www.json.cn/

请求头中User-Agent:客户端的类型

  • 简易的get请求

img

  • 简易的post请求

img

四 RESTful API规范

restful

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

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

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

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

# 10条规范

# https协议传输,接口特征api,多数据版本共存,数据即资源、名词url,资源操作即请求方式,url?传参过滤条件,响应状态码,返回错误信息即字典error,不同的操作有返回结果、被操作的对象,返回信息、其它资源的请求连接。

1 数据的安全保障:url链接一般都采用https协议进行传输
   注:采用https协议,可以提高数据交互过程中的安全性
   抓包工具:fiddler,charles
    
2 接口特征表现,一看就知道是个api接口
    - 用api关键字标识接口url:
      - [https://api.baidu.com](https://api.baidu.com/)
      - https://www.baidu.com/api
      注:看到api字眼,就代表该请求url链接是完成前后台数据交互的
      -路飞的接口:https://api.luffycity.com/api/v1/course/free/
            
3 多数据版本共存
    - 在url链接中标识数据版本
    - https://api.baidu.com/v1
    - https://api.baidu.com/v2
    注:url链接中的v1、v2就是不同数据版本的体现(只有在一种数据资源有多版本情况下)
    
4 数据即是资源,均使用名词(可复数)
    - 接口一般都是完成前后台数据的交互,交互的数据我们称之为资源
      - 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/place/search
      - https://api.baidu.com/login
        
5 资源操作由请求方式决定(method)
  - 操作资源一般都会涉及到增删改查,我们提供请求方式来标识增删改查动作
    - 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的书
        
6 过滤,通过在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:指定筛选条件
        
7 响应状态码
   1 正常响应
    - 响应状态码2xx
      - 200:常规请求
      - 201:创建成功
   2 重定向
    - 响应状态码3xx
      - 301:永久重定向
      - 302:暂时重定向
   3 客户端异常
    - 响应状态码4xx
      - 403:请求无权限
      - 404:请求路径不存在
      - 405:请求方法不存在
   4 服务器异常
    - 响应状态码5xx
      - 500:服务器异常
   5 正在处理请求:
    - 响应状态码1xx
    
 8 错误处理,应返回错误信息,error当做key
    {
        error: "无权限操作"
    }
    
 9 返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范
    GET /collection:返回资源对象的列表(数组)
    GET /collection/resource:返回单个资源对象
    POST /collection:返回新生成的资源对象
    PUT /collection/resource:返回完整的资源对象
    PATCH /collection/resource:返回完整的资源对象
    DELETE /collection/resource:返回一个空文档
    
 10 需要url请求的资源,需要加上访问资源的请求链接
    Hypermedia API:RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么
        {
            "status": 0,
            "msg": "ok",
            "results":[
                {
                    "name":"肯德基(罗餐厅)",
                    "img": "https://image.baidu.com/kfc/001.png"
                }
                ...
                ]
        }
# 响应数据要有状态码、状态信息以及数据本身
{
  	"status": 0,
  	"msg": "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"
        }
      	...
		]
}

五 序列化

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

序列化: 把 特有的数据 转换成 指定的统一的格式(json) 提供给别人。

反序列化:把 指定的统一的格式(json) 转换/还原成 特有的数据的格式,使用。

六 Django Rest_Framework

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

Django REST framework是一个建立在Django基础之上的Web 应用开发框架,可以快速的开发REST API接口应用。

在REST framework中,提供了序列化器Serialzier的定义,可以帮助我们简化序列化与反序列化的过程

不仅如此,还提供丰富的类视图、扩展类、视图集来简化视图的编写工作。

REST framework还提供了认证、权限、限流、过滤、分页、接口文档等功能支持。REST framework提供了一个API 的Web可视化界面来方便查看测试接口。

drf_logo

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

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

特点

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

补充:Django REST框架的视图基类是 APIView

文章连接:https://mp.weixin.qq.com/s?src=11&timestamp=1594026393&ver=2444&signature=9x64FPQQ0uNyE9F9RsDOZme8BoFdawObqaa4Dc*D5pcokWmg-IKgaGqMgTEdhKRMSGpT77v73onapCTvz2TRdyBhtHchBGLDjlG5W5KZ8cX9AXl9WPQ3TOQAVXmjYY6h&new=1

5 drf的安装和简单使用

# 安装:pip install djangorestframework==3.10.3
# 使用
	1 在setting.py 的app中注册
        INSTALLED_APPS = [
        'rest_framework'
        ]
    2 在models.py中写表模型
    	class Book(models.Model):
            nid=models.AutoField(primary_key=True)
            name=models.CharField(max_length=32)
            price=models.DecimalField(max_digits=5,decimal_places=2)
            author=models.CharField(max_length=32)
    3 新建一个序列化类(听不懂)
    	from rest_framework.serializers import ModelSerializer
        from app01.models import  Book
        class BookModelSerializer(ModelSerializer):
            class Meta:
                model = Book
                fields = "__all__"
    4 在视图中写视图类
        from rest_framework.viewsets import ModelViewSet
        from .models import Book
        from .ser import BookModelSerializer
        class BooksViewSet(ModelViewSet):
            queryset = Book.objects.all()
            serializer_class = BookModelSerializer
    5 写路由关系
    	from app01 import views
        from rest_framework.routers import DefaultRouter
        router = DefaultRouter()  # 可以处理视图的路由器
        router.register('book', views.BooksViewSet)  # 向路由器中注册视图集
          # 将路由器中的所以路由信息追到到django的路由列表中
        urlpatterns = [
            path('admin/', admin.site.urls),
        ]
        #这是什么意思?两个列表相加
        # router.urls  列表
        urlpatterns += router.urls
        
    6 启动,在postman中测试即可
原文地址:https://www.cnblogs.com/pythonwl/p/13257151.html