Flask路由可以指定HTTP请求方法,并在请求函数中根据不同的请求方法,执行不同的逻辑。这样实现一个Restful的请求已经相当简单了

Flask还有更简便的方法,就是其Flask-RESTful扩展。首先,我们来安装这个扩展:

pip install Flask-RESTful

安装完后,你就可以在代码中导入该扩展包

from flask import Flask, request
from flask_restful import Api, Resource app = Flask(__name__)
api = Api(app) USER_LIST = {
'': {'name':'Michael'},
'': {'name':'Tom'},
} class UserList(Resource):
def get(self):
return USER_LIST def post(self):
user_id = int(max(USER_LIST.keys())) + 1
user_id = '%i' % user_id
USER_LIST[user_id] = {'name': request.form['name']}
return USER_LIST[user_id] api.add_resource(UserList, '/users') if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)

这个例子很容易理解,Restful扩展通过”api.add_resource()”方法来添加路由,方法的第一个参数是一个类名,该类继承”Resource”基类,其成员函数定义了不同的HTTP请求方法的逻辑;第二个参数定义了URL路径。运行上面的例子并访问”http://localhost:5000/users”,GET请求时会列出全局变量”USER_LIST”中的内容,POST请求时会在”USER_LIST”中添加一项,并返回刚添加的项。如果在POST请求中找不到”name”字段,则返回”400 Bad Request”错误。由于类”UserList”没有定义”put”和”delete”函数,所以在PUT或DELETE请求时会返回”405 Method Not Allowed”错误。

另外,路由支持多路径,比如:

api.add_resource(UserList, '/userlist', '/users')

这样访问”http://localhost:5000/userlist”和”http://localhost:5000/users”的效果完全一样。

带参数的请求

上面的例子请求是针对user列表的,如果我们要对某个具体的user做操作,就需要传递具体的”user_id”了。这时候,我们需要路由支持带参数。Flask-RESTful的实现同Flask一样,就是在路由中加上参数变量即可。我们看下例子:

class User(Resource):
def get(self, user_id):
return USER_LIST[user_id] def delete(self, user_id):
del USER_LIST[user_id]
return '' def put(self, user_id):
USER_LIST[user_id] = {'name': request.form['name']}
return USER_LIST[user_id] api.add_resource(User, '/users/<user_id>')

在”api.add_resource()”的第二个参数路径中加上URL参数变量即可,格式Flask路由中完全一样,也支持转换器来转换变量类型。此外,在User类的GET,POST,PUT等成员函数中,记得加上参数”user_id”来获取传入的变量值。

参数解析

在POST或PUT请求中,直接访问form表单并验证的工作有些麻烦。Flask-RESTful提供了”reqparse”库来简化。我们来改进下上例中的PUT函数:

from flask_restful import reqparse

parser = reqparse.RequestParser()
parser.add_argument('name', type=str) class User(Resource):
def put(self, user_id):
args = parser.parse_args()
USER_LIST[user_id] = {'name': args['name']}
return USER_LIST[user_id]

可以通过”parser.add_argument()”方法来定义form表单字段,并指定其类型(本例中是字符型str)。然后在PUT函数中,就可以调用”parser.parse_args()”来获取表单内容,并返回一个字典,该字典就包含了表单的内容。”parser.parse_args()”方法会自动验证数据类型,并在类型不匹配时,返回400错误。你还可以添加”strict”参数,如”parser.parse_args(strict=True)”,此时如果请求中出现未定义的参数,也会返回400错误。

示例代码

from flask import Flask
from flask_restful import Api, Resource, reqparse, abort app = Flask(__name__)
api = Api(app) USER_LIST = {
1: {'name':'Michael'},
2: {'name':'Tom'},
} parser = reqparse.RequestParser()
parser.add_argument('name', type=str) def abort_if_not_exist(user_id):
if user_id not in USER_LIST:
abort(404, message="User {} doesn't exist".format(user_id)) class User(Resource):
def get(self, user_id):
abort_if_not_exist(user_id)
return USER_LIST[user_id] def delete(self, user_id):
abort_if_not_exist(user_id)
del USER_LIST[user_id]
return '', 204 def put(self, user_id):
args = parser.parse_args(strict=True)
USER_LIST[user_id] = {'name': args['name']}
return USER_LIST[user_id], 201 class UserList(Resource):
def get(self):
return USER_LIST def post(self):
args = parser.parse_args(strict=True)
user_id = int(max(USER_LIST.keys())) + 1
USER_LIST[user_id] = {'name': args['name']}
return USER_LIST[user_id], 201 api.add_resource(UserList, '/users')
api.add_resource(User, '/users/<int:user_id>') if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)

Flask 扩展 Flask-RESTful的更多相关文章

  1. Python flask 构建可扩展的restful apl☝☝☝

    Python flask 构建可扩展的restful apl☝☝☝ Flask-RESTful是flask的扩展,增加了对快速构建REST API的支持.Flask-RESTful通过最少的设置鼓励最 ...

  2. Python flask 构建可扩展的restful apl✍✍✍

    Python flask 构建可扩展的restful apl  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课 ...

  3. 使用python的Flask实现一个RESTful API服务器端[翻译]

    最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了. 本文将会使用python的Flask框架轻松实现一个RESTful的服务 ...

  4. Python flask 基于 Flask 提供 RESTful Web 服务

    转载自 http://python.jobbole.com/87118/ 什么是 REST REST 全称是 Representational State Transfer,翻译成中文是『表现层状态转 ...

  5. 使用python的Flask实现一个RESTful API服务器端

    使用python的Flask实现一个RESTful API服务器端 最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了. 本文 ...

  6. Flask 扩展 HTTP认证

    Restful API不保存状态,无法依赖Cookie及Session来保存用户信息,自然也无法使用Flask-Login扩展来实现用户认证.所以这里,我们就要介绍另一个扩展,Flask-HTTPAu ...

  7. 转:使用python的Flask实现一个RESTful API服务器端

    提示:可以学习一下flask框架中对于密码进行校验的部分.封装了太多操作. 最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了 ...

  8. Flask扩展实现HTTP令牌token认证HTTPTokenAuth

    Token认证 在restful设计中,用户认证模式通常使用json web token,而不会使用传统的HTTP Basic认证(传入账号密码) token认证模式如下:在请求header中加入to ...

  9. Python的Flask框架开发RESTful API

    web框架选择 Django,流行但是笨重,还麻烦,人生苦短,肯定不选 web.py,轻量,但据说作者仙逝无人维护,好吧,先pass tornado,据说倡导自己造轮子,虽然是facebook开源的吧 ...

随机推荐

  1. 【BZOJ1084】最大子矩阵(动态规划)

    [BZOJ1084]最大子矩阵(动态规划) 题面 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式 ...

  2. 关于怎么快速学好Android应用程序开发及其其他编程语言(大牛和高手勿喷,此篇文章也适合刚入门小师弟和小师妹)

    无论你是从.NET转过来的也好 还是从PHP转过来的等等等,能看到这篇文章的人一般都是想快速转行到Android应用程序开发,希望我的这篇文章能勉励到各位的同时,也能勉励我自己. 1.编程语言基本都会 ...

  3. 在开启kerberos 后,hbase存在数据命名空间的问题(解决方案)

    用hbase的超级用户 su - hbasekinit -kt /etc/security/keytabs/hbase.headless.keytab hbase-bigdata@STARYEA.CO ...

  4. 使用Python解析豆瓣上Json格式数据

    现在的API接口多为xml或json,json解析更简洁相对xml来说 以豆瓣的API接口为例,解析返回的json数据: https://api.douban.com/v2/book/1220562 ...

  5. linux实验一 双系统安装

    (一)首先来简要了解一些linux的概念! 1.发行版本和内核版本的区别与联系:linux发行版本是"内核版本+一系列挂载软件"的集合体,光是一个内核版本是无法当做操作系统运行的. ...

  6. Android消息机制解析

    我们知道在编程时许多操作(如更新UI)需要在主线程中完成,而且,耗时操作(如网络连接)需要放在子线程中,否则会引起ANR.所以我们常使用Handler来实现线程间的消息传递,这里讨论的也就是Handl ...

  7. NYOJ 题目12喷水装置(二)

    #include<iostream> #include<algorithm> #include<cmath> using namespace std; struct ...

  8. webuploader 上传文件 生成链接下载文件

    最近 在asp.net MVC 项目 需要实现一个Excel和 图片上传功能.之前有使用过SWFUpload 做过上传图片功能,在本次实现过程中,有人推荐WebUploader 上传组件,因此采用we ...

  9. js中==和===区别

    简单来说: == 代表相同, ===代表严格相同, 为啥这么说呢, 这么理解: 当进行双等号比较时候: 先检查两个操作数数据类型,如果相同, 则进行===比较, 如果不同, 则愿意为你进行一次类型转换 ...

  10. ASP.NET MVC编程——模型

    1 ViewModel 是一种专门提供给View使用的模型,使用ViewModel的理由是实体或领域模型所包含的属性比View使用的多或少,这种情况下实体或领域模型不适合View使用. 2模型绑定 默 ...