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. 洛谷P3796 【模板】AC自动机(加强版)(AC自动机)

    洛谷题目传送门 先膜一发yyb巨佬 orz 想学ac自动机的话,推荐一下yyb巨佬的博客,本蒟蒻也是从那里开始学的. 思路分析 裸的AC自动机,这里就不讲了.主要是这题太卡时了,尽管时限放的很大了.. ...

  2. [BZOJ3460] Jc的宿舍

    bzoj 题面放一下 Description WC2014后无数人来膜拜jc,但是来膜拜的人实在太多了, 而且很多人是一连膜拜好几天.所以jc给这些人建了一座树 形的宿舍,而根节点(1号节点)住着jc ...

  3. 【NOIP2014】【洛谷1941】【CJOJ1672】飞扬的小鸟

    题面 描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话, ...

  4. BZOJ第7页养成计划

    嗯,用这篇博客当一个目录,方便自己和学弟(妹?)们查阅.不定期更新. BZOJ1600   BZOJ1601   BZOJ1602   BZOJ1603   BZOJ1604   BZOJ1605   ...

  5. Android Studio 封装的类的继承

    有个封装好的Firebase.java文件,放到项目中直接使用就可以,这个需要继承一个AbstractFirebase类,在广告代码中,可以等到加广告的时候来加这个文件. 这个地方的继承,因为是ads ...

  6. iOS学习——UITableViewCell两种重用方法的区别

    今天在开发过程中用到了UITableView,在对cell进行设置的时候,我发现对UITableViewCell的重用设置的方法有如下两种,刚开始我也不太清楚这两种之间有什么区别.直到我在使用方法二进 ...

  7. Oracle GoldenGate实现数据库同步

    前言:最近刚好在弄数据库同步,网上查了些资料再加上自己整理了一些,做个分享! 一.GoldenGate的安装 1.安装包准备 数据库版本:Oracle Database 11g Release 2(1 ...

  8. python 全栈开发,Day2

    python基础二(基础数据类型) 一.数据 1 什么是数据? x=10,10是我们要存储的数据 2 为何数据要分不同的类型 数据是用来表示状态的,不同的状态就应该用不同的类型的数据去表示 3 数据类 ...

  9. Jmeter + Ant 测试环境搭建 及解决问题: the <jmeter> type doesn't support nested text data

    1.首先确保测试机器中已经按照jdk1.6以上版本,如果没有,那就上官网下载吧. 2.下载Ant,解压至指定目录,并配置好环境变量:http://ant.apache.org/ 在命令行下执行ant ...

  10. SoupUI安装

    (仅供学习,严禁用于商业应用) 今天开始在公司需要做websocket接口测试,以前从来没有接触过,对美好生活充满了向往啊,今天从安装开始吧! 至于什么是websocket自行百度,我也是百度出来的, ...