• 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中测试即可
    
  • 相关阅读:
    进程间通信 —— 命名管道
    判断当前线程是否有管理者权限
    获取操作系统OS等相关信息
    VS2017编译动态链接库报错
    git rebase 和 git merger
    Android开发之深入理解泛型extends和super的区别
    Android开发之深入理解Android Studio构建文件build.gradle配置
    Android开发之深入理解Android 7.0系统权限更改相关文档
    Android 开发之深入理解安卓调试桥各种错误解决办法
    自定义弹窗 VS AlertDialog分享弹窗
  • 原文地址:https://www.cnblogs.com/pythonwl/p/13257151.html
Copyright © 2020-2023  润新知