使用flask-restful插件实现restful接口

这篇文章是自己的学习总结,阅读顺序如下

  • API的理解
  • RESTful API
  • 使用Flask 实现RESTful API
  • 学习积累

**

API的理解

**
API(application programming interfaces),即应用程序编程接口。API由服务器(Server)提供(服务器有各种各样的类型,一般我们浏览网页用到的是web server,即网络服务器),通过API,计算机可以读取、编辑网站数据,就像人类可以加载网页、提交信息等。通俗地,API可以理解为家用电器的插头,用户只提供插座,并执行将插头插入插座的行为,不需要考虑电器内部如何运作。从另外一个角度上讲API是一套协议,规定了与外界的沟通方式:如何发送请求和接受响应。

RESTful API

RESTful API即满足RESTful风格设计的API,RESTful表示的是一种互联网软件架构(以网络为基础的应用软件的架构设计),如果一个架构符合REST原则,就称它为RESTful架构。RESTful架构的特点:

每一个URI代表一种资源;
客户端和服务器之间,传递这种资源的某种表现层;把"资源"具体呈现出来的形式,叫做它的"表现层"(Representation)。比如,文本可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现,甚至可以采用二进制格式;图片可以用JPG格式表现,也可以用PNG格式表现。
客户端通过四个HTTP动词,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。

使用Flask实现RESTful API

使用python实现restful接口主要有两种方法:1.直接使用falsk 2.使用flask插件flaskrestful。直接使用flask主要是使用装饰器定义路由,需要定义http方法,详情参见,Flask-RESTful 是一个可以简化 APIs 的构建的 Flask 扩展。
本文主要实现使用flask插件Flask-RESTful实现restful API。
1. 安装

pip install flask-restful

2. 常用模块
Api, Resource, reqparse, abort
Flask-RESTful 提供了一个 Resource 基础类,它能够定义一个给定 URL 的一个或者多个 HTTP 方法。例如,定义一个可以使用 HTTP 的 GET, PUT 以及 DELETE 方法的 User 资源。

3. 实现举例
本例中我们将以对服务器数据库中的书目信息进行增删改查为例,实现API
规定 对象属性
ID:int
Name:str
Description:str
state:bool

|HTTP方法| --------------URL ------------------------------------------|-----------动作----------
|GET |http://[hostnamt]/restful_test/v2.0/tasks |检索任务列表
|GET |http://[hostnamt]/restful_test/v2.0/tasks/[task_id] |检索某个任务
|PUT |http://[hostnamt]/restful_test/v2.0/tasks/[task_id] |修改某个任务
|POST |http://[hostnamt]/restful_test/v2.0/tasks |创建新任务
|DELETE |http://[hostnamt]/restful_test/v2.0/tasks/[task_id]|删除某个任务

1)代码构架
根据我们的需求,设计整体代码构架如下

class TodoSimple1(Resource):
    def get(self,task_id):
        pass
    def put(self,task_id):
        pass
    def delete(self,task_id):
        pass
class TodoSimple2(Resource):
    def get(self):
        pass
    def post(self):
        pass
api.add_resource(TodoSimple1, '/restful_test/v2.0/tasks/<int task_id>', '/BookList')    
api.add_resource(TodoSimple2, '/restful_test/v2.0/tasks', '/BookList') 

由于我们定义的url分为两类:固定的,带有可变参数的。故定义了两个类TodoSimple1,TodoSimple2 。在第一个类里面实现get,put,delete方法,这些方法需要使用可变参数,在第二个类里面实现get,post方法,这些方法不需要使用可变参数。不同于直接使用flask里面使用装饰器来制定路由,使用api.add_resource()方法,为类指定路由,第一个参数为类名,第二个参数为制定的路由地址,第三个参数为指定的endpoint。

2)方法实现
构建一个全局的数据字典

BookList = {
      '1': { 
        'id':1,
        'name':"book1",
        'description':"Math Book",
        'state':True
        },
       '2': { 
        'id':2,
        'name':"book2",
        'description':"Chinese Book",
        'state':True
        }
    }

字典中的数据使用key:value的形式

class TodoSimple2(Resource):
    def get(self):  
        return BookList
    
    def post(self):
        
        task_id = int(max(BookList.keys())) + 1
        task_id = '%i' % task_id
        BookList[task_id] = {'name': request.form['name'],'id':request.form['id'],'description':request.form['description'],'state':request.form['state']}
        return BookList

实现get方法,可以查看任务列表,使用post方法可以创建新的对象。使用request.from方法将from表单的数据加载到数据字典里面。

parse = reqparse.RequestParser()
parse.add_argument('name', type=str,location=['json'])
parse.add_argument('description', type=str,location=['json'])
parse.add_argument('state', type=str,location=['json'])
parse.add_argument('id', type=str,location=['json'])

class TodoSimple1(Resource):
    def get(self,task_id):
        return BookList[task_id]
    
    def put(self,task_id):
        args = parse.parse_args(strict=True)
        BookList[task_id] = {'name': args['name'],'id':args['id'],'description':args['description'],'state':args['state']}
        return BookList[task_id]
    
    def delete(self,task_id):
        del BookList[task_id]
        return BookList

在这里着重说一下put方法。在put方法里面使用了restful里面的reqparse模块,来改变允许接收的数据类型。

parser.add_argument('app_id', type=zero_int, required=True, nullable=False, location=['json'])
parser.add_argument('user_num', type=empty_str, required=True, nullable=False, location=['json'])

type基本类型可以有:int , zero_int ,str,empty_str, location可以为:form , json等,详情可查看官方文档。这里要特别说一下如何获取前端的list参数,通过action和type结合使用设置
默认情况下,location为from形式,即接收from表单,当设置为json时就可以接收json包了。

4. 实现结果

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

学习积累

from表单和json的区别
application/json
随着json规范的越来越流行,并且浏览器支持程度原来越好,许多开发人员以application/json作为请求content-type,告诉服务器请求的主题内容是json格式的字符串,服务器端会对json字符串进行解析,这种方式的好处就是前端人员不需要关心数据结构的复杂度,只要是标准的json格式就能提交成功,application/json数据格式越来越得到开发人员的青睐。

application/x-www-form-urlencoded方式
是Jquery的Ajax请求默认方式,这种方式的好处就是浏览器都支持,在请求发送过程中会对数据进行序列化处理,以键值对形式?key1=value1&key2=value2的方式发送到服务器,如果用Jquery,它内部已经进行了处理,如果自己写原生的Ajax请求,就需要自己对数据进行序列化。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值