python-DRF_restful规范_APIView源码分析_Request类分析_序列化组件的使用及字段类型和字段参数_保存功能_字典校验_read_only和write_only

2023-11-13

DRF-Django rest framework

1. restful

1. 什么是RESTful

	REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”

	REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态

	所有的数据,不过是通过网络获取的还是操作(增删改查)的数据,都是资源,将一切数据视为资源是REST区别与其他架构风格的最本质属性

对于REST这种面向资源的架构风格,有人提出一种全新的结构理念,即:
    	面向资源架构(ROA:Resource Oriented Architecture)

2. RESTful API设计

API与用户的通信协议,总是使用HTTPs协议

# 域名 
    https://api.example.com       尽量将API部署在专用域名(会存在跨域问题)
    https://example.org/api/      API很简单
# 版本
	URL,如:https://api.example.com/v1/
	请求头 跨域时,引发发送多次请求
# 路径,视网络上任何东西都是资源,均使用名词表示(可复数)
    https://api.example.com/v1/zoos
    https://api.example.com/v1/animals
    https://api.example.com/v1/employees
# method
    GET    :从服务器取出资源(一项或多项)
    POST   :在服务器新建一个资源
    PUT    :在服务器更新资源(客户端提供改变后的完整资源)
    PATCH  :在服务器更新资源(客户端提供改变的属性)
    DELETE :从服务器删除资源
# 状态码
    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 - [*]:
    	服务器发生错误,用户将无法判断发出的请求是否成功。

    更多看这里:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

# 错误处理,应返回错误信息,error当做key
	{
    	error: "Invalid API key"
	}

3. restful规范

1. Representational State Transfer:
    	表征性状态转移

2. Web API接口的设计风格,尤其适用于前后端分离的应用模式中

3. 与语言,平台无关,任何框架都可以写出符合restful规范的api接口

4. 规范:10-1  数据的安全保障:url链接一般都采用https协议进行传输

    -2  接口特征表现:api关键字标识
            -https://api.baidu.com/books/
            -https://www.baidu.com/api/books/

    -3 多版本共存:url链接中标识接口版本
            -https://api.baidu.com/v1/books/
            -https://api.baidu.com/v2/books/

    -4 数据即是资源,均使用名词(可复数)
    	-接口一般都是完成前后台数据的交互,交互的数据我们称之为资源
        -一般提倡用资源的复数形式,不要使用动词
        -查询所有图书
        	-https://api.baidu.com/books/
            -https://api.baidu.com/get_all_books/ # 错误示范
            -https://api.baidu.com/delete-user    # 错误的示范
            -https://api.baidu.com/user           # 删除用户的示例:疑问:到底是删还是查?

	-5 资源操作由请求方式决定:
		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&limit=3
            指定返回记录的开始位置
        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  响应状态码
		-返回数据中带状态码
		-{'code':100}

   -8 返回结果中带错误信息
		-{'code':100,'msg':'因为xx原因失败'}

   -9 返回结果,该符合以下规范
		GET /collection:返回资源对象的列表(数组)
        GET /collection/resource:返回单个资源对象(字典)
        POST /collection:返回新生成的资源对象    (新增后的对象字典)
        PUT /collection/resource:返回完整的资源对象 (修改后的对象字典)
        PATCH /collection/resource:返回完整的资源对象 (修改后的对象字典)
        DELETE /collection/resource:返回一个空文档   ()

   -10 返回的数据中带链接地址
		-查询id1的图书接口,返回结果示例
    	{'code':100,
         'msg':'成功',
         'result':
             {'title':'金瓶梅',
              'price':12.3,
              'publish':'https://127.0.0.1/api/v1/publish/3'
             }
        }

4. 基于Django实现

1. 路由系统
urlpatterns = [
    url(r'^users/$', views.Users.as_view()),
    url(r'^users2/$', views.user2),
]
2. 视图函数
import json

def  user2(request):
    if request.method=='GET':
        dic = {'status':200,'name': 'lqz2', 'age': 18}
        return HttpResponse(json.dumps(dic))
    elif request.method=='POST':
        dic = {'status': 200, 'msg': '修改成功'}
        return JsonResponse(dic)

class Users(View):
    def get(self, request):
        dic = {'status':200,'name': 'lqz', 'age': 18}
        return HttpResponse(json.dumps(dic))

    def post(self, request):
        dic = {'status': 200, 'msg': '修改成功'}
        return JsonResponse(dic)

2. APIview源码分析

1. APIview的as_view
	-内部还是执行了View的闭包函数view
    -禁用掉了csrf
    -一切皆对象,函数也是对象  函数地址.name=lqz

2. 原生View类中过的as_view中的闭包函数view
	-本质执行了self.dispatch(request, *args, **kwargs),执行的是APIView的dispatch

3. APIView的dispatch
    def dispatch(self, request, *args, **kwargs):
        # DRF的Request类的对象,内部有request._request,是原生request
        request = self.initialize_request(request, *args, **kwargs)
        self.request = request

        try:
            self.initial(request, *args, **kwargs)
            '''
            # 认证,权限,频率
            self.perform_authentication(request)
        	self.check_permissions(request)
        	self.check_throttles(request)
            '''
            if request.method.lower() in self.http_method_names:
                handler = getattr(self, request.method.lower(),
                                  self.http_method_not_allowed)
            else:
                handler = self.http_method_not_allowed

            response = handler(request, *args, **kwargs)

        except Exception as exc:
            # 全局的异常捕获
            response = self.handle_exception(exc)
		# 把视图函数(类)返回的response,又包装了一下
        self.response = self.finalize_response(request, response, *args, **kwargs)
        return self.response

3. Request类分析介绍

在这里插入图片描述

# Request类
	-request._request: 原生request
    -request.data    : post请求提交的数据(urlencoded,json,formdata)
    -request.user    : 不是原生的user了
    -request.query_params : 原生的request.GET,为了遵循restful规范
    -requset.FILES   :新的
    -重写了__getattr__,新的request.原来所有的属性和方法,都能直接拿到
        def __getattr__(self, attr):
            return getattr(self._request, attr)

4. 序列化组件介绍

# 作用:
    1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串
    	-Book ---> 序列化器 ---> 字典 ---> 同过drf:Response ---> json格式字符串 ---> 传给前端

    2. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型
    	json格式数据 ---> drf:Request ---> 字典 ---> 序列化器 ---> Book

    3. 反序列化,完成数据校验功能

5. 序列化组件简单使用

1. 使用步骤

# 序列化的使用
	-写一个序列化类继承serializers.Serializer
    -在类中写要序列化的字段
    -在视图类中,实例化得到一个序列化类的对象,把要序列化的数据传入
    	ser=BookSerializer(instance=res,many=True)
    -得到字典
    	ser.data就是序列化后的字典

2. 代码实现

serializer.py
from rest_framework import serializers
class BookSerializer(serializers.Serializer):
    # 要序列化哪个字段
    id=serializers.IntegerField()
    # id=serializers.CharField()
    title=serializers.CharField(max_length=32)
    price=serializers.DecimalField(max_digits=5, decimal_places=2)
    # publish=serializers.CharField(max_length=32)
models.py
class Book(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    publish = models.CharField(max_length=32)
views.py
from app01 import models
from app01.serializer import BookSerializer
class Book(APIView):
    def get(self,request,*args,**kwargs):

        res=models.Book.objects.all()
        # 借助序列化器
        # 如果是多条,就是many=True
        # 如果是单个对象,就不写
        ser=BookSerializer(instance=res,many=True)
        # 通过序列化器得到的字典
        # ser.data
        print(ser.data)
        return Response(ser.data)
urls.py
path('books/', views.Book.as_view()),

6. 序列化类字段类型和字段参数

# 字段类型(记列的这几个)
	-IntegerField
    -CharField
    -DecimalField
    -DateTimeField
    -跟models中大差不差

# 常用字段参数
	-选项参数
        max_length	最大长度
        min_lenght	最小长度
        allow_blank	是否允许为空
        trim_whitespace	是否截断空白字符
        max_value	最小值
        min_value	最大值

    -通用参数
    	# 重点
        read_only	表明该字段仅用于序列化输出,默认False
        write_only	表明该字段仅用于反序列化输入,默认False

        # 掌握
        required	表明该字段在反序列化时必须输入,默认True
        default	    反序列化时使用的默认值
        allow_null	表明该字段是否允许传入None,默认False

        # 了解
        validators	该字段使用的验证器
        error_messages	包含错误编号与错误信息的字典

7. 序列化器的保存功能

# 如果序列化类继承的是Serializer,必须重写create方法
# 使用方式
	-视图类
     def post(self, request):
        print(request.data)
        ser = BookSerializer(data=request.data)
        if ser.is_valid():
            ser.save()  # 保存到数据库中
            return Response(ser.data)
        else:
            # 没有校验通过的错误信息
            return Response(ser.errors)
    -序列化类
    class BookSerializer(serializers.Serializer):
        ...

        def create(self, validated_data):
            # 为什么要重写create?  多个表模型之间字段命名相同 后台无法识别要保存数据到哪个模型
            res=models.Book.objects.create(**validated_data)
            print(res)
            return res

8. 序列化器的字段校验功能

# 三种方式
	1. 字段自己的校验规则(max_length...2. validators的校验
        publish = serializers.CharField(max_length=32,validators=[check,])

        def check(data):
        if len(data)>10:
            raise ValidationError('最长不能超过10')
        else:
            return data

    3. 局部和全局钩子
        # 局部钩子,validate_字段名,需要带一个data,data就是该字段的数据
        def validate_title(self, data):
            if data.startswith('sb'):
                raise ValidationError('不能以sb开头')
            else:
                return data

        # 全局钩子
        def validate(self, attrs):
            title=attrs.get('title')
            publish=attrs.get('publish')
            if title==publish:
                raise ValidationError('书名不能跟出版社同名')
            else:
                return attrs

9. read_only和write_only

read_only
	表明该字段仅用于序列化输出,默认False

write_only
    表明该字段仅用于反序列化输入,默认False

class BookSerializer(serializers.Serializer):
	# 要序列化哪个字段
    id = serializers.IntegerField(required=False)
    # id=serializers.CharField()
    title = serializers.CharField(max_length=32,min_length=2,read_only=True)
    price = serializers.DecimalField(max_digits=5, decimal_places=2)
    # 序列化的时候看不到
    publish = serializers.CharField(max_length=32,validators=[check,],write_only=True)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python-DRF_restful规范_APIView源码分析_Request类分析_序列化组件的使用及字段类型和字段参数_保存功能_字典校验_read_only和write_only 的相关文章

  • 腾讯云COS+PicGo+Typora十分钟搭建自己的图床

    文章目录 一 腾讯云配置 1 购买COS 新人可以1元购相当于白嫖 2 前往对象存储页面创建存储桶 3 在存储桶中创建文件夹 4 回到概览获取基本信息 5 获取用户密钥管理 二 配置PicGo 1 下载安装PicGo 2 配置PicGo 三
  • FCN(全卷积网络)详解

    FCN详解 全卷积网络就是在全连接网络的基础上 通过用卷积网络替换全连接网络得到的 首先看一下什么是全连接网络 以及全连接网络的缺点 通常的CNN网络中 在最后都会有几层全连接网络来融合特征信息 然后再对融合后的特征信息进行softmax分
  • 3个收缩/展开/折叠的js代码

    第一种
  • 心理学的166个现象---之八

    141 同体效应 同体效应也称自己人效应 是指学生把教师归于同一类型的人 是知心朋友 学生对 自己人 的话更信赖 更易于接受 管理心理学中有句名言 如果你想要人们相信你是对的 并按照你的意见行事 那就首先需要人们喜欢你 否则 你的尝试就会失
  • (#########优化器函数########)TensorFlow实现与优化深度神经网络

    反正是要学一些API的 不如直接从例子里面学习怎么使用API 这样同时可以复习一下一些基本的机器学习知识 但是一开始开始和以前一样 先直接讲类和常用函数用法 然后举例子 这里主要是各种优化器 以及使用 因为大多数机器学习任务就是最小化损失
  • AD添加3D模型

    对于为给PCB添加3D模型 很多人觉得这是个绣花针的活 中看不中用 在我看来这也未必 特别是常用的3D模型能在网上下载的今天 只需要几个简单的操作 就能使你的PCB更加赏心悦目 除此之外 3D模型还有以下优点 优化元器件的布局 检查元件焊盘
  • 快速删除系统服务命令 sc delete ServiceName

    快速删除系统服务命令 sc delete ServiceName 要删除名为ServiceName的服务 可以用XP自带服务管理工具 SCP sc exe命令用以下命令即可删除指定的服务 sc delete ServiceName这些命令的
  • 解决httpd: Could not reliably determine the server's fully qualified domain name

    測試系統 mdv2007 service httpd restart 出現下面錯誤 Shutting down httpd OK Starting httpd httpd Could not reliably determine the s
  • 如何测试生成式人工智能(AIGC)

    简介 在人工智能日趋普及的今天 生成式人工智能 AIGC 已经成为不可忽视的一个分支 从自动化生成新闻 编写代码到图像和音频生成 AIGC几乎无处不在 但如何确保这些生成的内容达到预期标准 安全可靠 同时又具有高度的可用性呢 这是一个值得细
  • 使用hyper-V 编译和调试Android13(android-13.0.0_r3)源码

    环境 windows10 hyper V ubuntu20 4 LST 之前写了一篇Andrid9的编译 但是之前是使用的Vmware虚拟机 ubuntu20 4 LST 由于重装系统 Vmware不见了 不想单独装个虚拟机软件 加上现在w
  • matlab读取文件各种方法

    本技术支持指南主要处理 ascii binary and mat files 要得到matlab中可用来读写各种文件格式的完全函数列表 可以键入以下命令 help iofun matlab中有两种文件i o程序 high level and
  • js6语法总结

    Vuex Action的 commit
  • Linux定时任务crontab

    格式要求如下 For details see man 4 crontabs Example of job definition minute 0 59 hour 0 23 day of month 1 31 month 1 12 OR ja
  • IOS 图片转换二进制 二进制转换为图片

    类方法 图片 转换为二进制 NSData Image TransForm Data UIImage image NSData imageData UIImageJPEGRepresentation image 0 5 几乎是按0 5图片大小
  • axure到底好不好学,有哪些技巧

    Axure学习难吗 这个问题一直引起很多朋友的讨论 有的觉得难 有的觉得不难 当然 人不一样 每个人的学习方式也不一样 对学习难度的理解自然也不一样 这个问题自然没有定论 在学习的时候 有很多方法可以帮助我们 有不同的意见 我们需要尽可能多
  • 一份完整的问卷模板_Word制作问卷调查模板表「教你复选框打钩」

    作者易雪龙转自 Word联盟 问卷调查相信大家都有用过吧 就是一些问题 然后下面有几个选项给我们选择 类似这种问卷调查模板 其实用Word也是可以制作出来的 今天 易老师就来教一下大家利用Word来制作一份电子版的调查问卷 效果演示 Wor
  • 模型/视图编程

    模型 视图编程 模型 视图编程 模型 视图 委托 模型 视图编程 Qt中的模型 视图架构用来实现大量的数据存储 处理及显示 MVC Model View Controller 包括了3个组件 模型 Model 是应用对象 用来表示数据 视图
  • Lotus Domino Notes表单,页面,视图,文档,域之间的关系

    1 表单 Form 关系型数据库里的 表设计 关系型数据库中通过表设计来定义这张Table上会有哪些字段 字段的类型以及长度等 然后通过Table来创建符合这个Table定义的记录 Record 通常情况下 Lotus通过表单 Form 来
  • Micropython史上最友好的编辑器,小巧精悍

    Python 因为非常好学 易上手故而广受大众的喜欢 micropython 也因此在物联网单片机领域拥有一席之位 并且 python 有着良好的生态环境 功能亦更加丰富 from machine import Pin p0 Pin 0 P
  • 购物商城---SpringMVC拦截器的使用

    springmvc front xml

随机推荐

  • spring data jpa

    Spring Data是什么 Spring Data是一个用于简化数据库访问 并支持云服务的开源框架 其主要目标是使得对数据的访问变得方便快捷 并支持map reduce框架和云计算数据服务 Spring Data 包含多个子项目 Comm
  • 深度学习中矩阵求导公式整理

    深度学习中矩阵求导公式整理 1 两种布局约定方式 2 矩阵求导的类型 3 标量对标量求导 4 向量对标量求导 5 矩阵对标量求导 6 标量对向量求导 7 向量对向量求导 8 标量对矩阵求导 参考文献 1 两种布局约定方式 布局 Layout
  • 机试算法题-敲击计数器

    题目 设计一个敲击计数器 使它可以统计在过去 5 分钟内被敲击次数 即过去 300 秒 您的系统应该接受一个时间戳参数 timestamp 单位为 秒 并且您可以假定对系统的调用是按时间顺序进行的 即 timestamp 是单调递增的 几次
  • CVPR 2022

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 转载自 集智书童 On the Integration of Self Attention and Convolution 论文 https arxiv org abs
  • 回溯算法-----473. 火柴拼正方形&&698. 划分为k个相等的子集

    分享两个回溯算法解决的算法题 和自己以往做这类题目的思路不同 导致这里卡了很久 不得不花几个小时总结一下 火柴拼正方形 首先展示一下自己一开始的回溯算法的解决方式 其实这个也是自己进行了优化之后的 没有优化之前是超时的 public boo
  • 如何导出存储过程、函数、包和触发器的定义语句?如何导出表和索引的创建语句?...

    Oracle中如何导出存储过程 函数 包和触发器的定义语句 如何导出表的结构 如何导出索引的创建语句 QQ群里有人问 如何导出一个用户下的存储过程 麦苗答 方法有多种 可以使用DBMS METADATA GET DDL包 使用PL SQL
  • Java实现质数筛的三种方法

    今天在做一个算法题的时候遇到一个需要求质数的情况 但是本人比较菜只会暴力做法 所以在此记录学习一下质数筛选除了暴力以外的其它做法 注意 一个大于1的自然数 除了1和它自身外 不能被其他自然数整除的数叫做质数 题目 暴力做法 直接根据定义写一
  • docker stats 命令详解

    docker stats 显示容器资源的使用情况 包括 CPU 内存 网络 I O 等 docker stats OPTIONS CONTAINER OPTIONS 说明 all a 显示所有的容器 包括未运行的 format 指定返回值的
  • [NKCTF2023]web/misc/blockchain-wp

    总体体验还是不错的 感谢我的二进制队友带我 WEB babyphp Pop链 链子 destruct gt toString gt invoke 最后要绕一个正则匹配 通过dir命令发现flag在 f1ag中 利用剩下没被过滤的通配符进行匹
  • OpenWRT路由器中监控网络服务并重启的脚本

    转载地址 http jamesqi com E5 8D 9A E5 AE A2 OpenWRT E8 B7 AF E7 94 B1 E5 99 A8 E4 B8 AD E7 9B 91 E6 8E A7 E7 BD 91 E7 BB 9C
  • 删除链表中重复的节点(Java实现)

    问题描述 在一个排序的链表中 存在重复的结点 请删除该链表中重复的结点 重复的结点不保留 返回链表头指针 例如 链表1 gt 2 gt 3 gt 3 gt 4 gt 4 gt 5 处理后为 1 gt 2 gt 5 解决方案 注意边界即可 代
  • UE4_UATHelper: Packaging (Windows (64-bit)): ERROR: Failed to copy

    在项目中引用了开发的插件 插件中引用了第三方库 目录结构如下 报错信息如下 UATHelper Packaging Windows 64 bit ERROR Failed to copy E Project WorkSpace KafkaD
  • 知识图谱(Knowledge Graph)

    这篇文章的目的就是给不了解知识图谱的人做一个简单的科普 一 什么是知识图谱 知识图谱 Knowledge Graph 又称为科学知识图谱 在图书情报界称为知识域可视化或知识领域映射地图 是显示知识发展进程与结构关系的一系列各种不同的图形 用
  • Sqlilabs-19

    第 19 关跟第 18 关类似 User Agent 改成了 Referer 改造注入 Referer 浏览器向 WEB 服务器表明自己是从哪个网页 URL 获得 点击 当前请求中的网址 URL 同样的 这一关对 usernanme 和 p
  • 关闭占用某个端口的进程,例如8080

    问题 Web server failed to start Port 8080 was already in use 办法一 1 查看端口号的进程号 netstat ano findstr 端口号 2 任务管理器关闭 办法二 使用命令关闭
  • 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

    题目 定义栈的数据结构 请在该类型中实现一个能够得到栈中所含最小元素的min函数 时间复杂度应为O 1 分析 使用双栈实现 一个数据栈data 一个最小栈min 数据栈存正常入栈的元素 最小栈永远存数据栈中当前最小值 具体是依靠以下规则来实
  • 分布式一致性与共识算法简介

    在介绍Raft算法之前 请考虑一下如果有机会 你会怎么设计一个分布式系统 注意 这里所说的分布式系统是几台服务器组成的一个对外服务的系统 比如分布式KV系统 分布式数据库系统等 如果是单机系统 数据一般都在本地 基本不需要与外部通信 比如单
  • 【ML】数据预处理

    前言 对于数据的预处理 没有固定的步骤 下文写的仅仅的常规的一些小步骤 具体的预处理 还需要根据数据以及需求来自行处理 Python STEP1 导入依赖包 import numpy as np import matplotlib pypl
  • docker gitlab安装

    1 拉取gitlab镜像 gitlab ce为稳定版本 后面不填写版本则默认pull最新latest版本 docker pull gitlab gitlab ce 若你想装中文版本 docker pull beginor gitlab ce
  • python-DRF_restful规范_APIView源码分析_Request类分析_序列化组件的使用及字段类型和字段参数_保存功能_字典校验_read_only和write_only

    DRF Django rest framework 1 restful 1 什么是RESTful REST与技术无关 代表的是一种软件架构风格 REST是Representational State Transfer的简称 中文翻译为 表征