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. 元素(WebElement)-----Selenium快速入门(三)

    上一篇<元素定位-----Selenium快速入门(二)>说了,如何定位元素,本篇说说找到的元素(WebElement)该怎么用. WebElement常用方法:  返回值  方法名  说 ...

  2. 【NOI2001】炮兵阵地(状态压缩,动态规划)

    题面 题面中有图片的存在,所以就贴个地址把 题解 简单题,,,, 原来一直觉得不会做... 现在发现是一道傻逼题 暴力压两行的状态 发现就需要滚一维. 然后暴力检查一下状态的可行性 DP检查MAX就可 ...

  3. 【POJ2387】Til the Cows Come Home (最短路)

    题面 Bessie is out in the field and wants to get back to the barn to get as much sleep as possible bef ...

  4. 【Learning】带花树——一般图最大匹配

    一般图最大匹配--带花树 问题 ​ 给定一个图,求该图的最大匹配.即找到最多的边,使得每个点至多属于一条边. ​ 这个问题的退化版本就是二分图最大匹配. ​ 由于二分图中不存在奇环,偶环对最大匹配并无 ...

  5. react-todoMVC脚手架

    webpack.config.js var path = require('path'); // node中的 路径解析的模块 const HtmlWebpackPlugin =require('ht ...

  6. c# 使用EnyimMemcached 连接memcache

    首先nuget安装EnyimMemcached,本地启动memcache,往app.config(mvc项目则是web.config)加入以下内容: configSection内加入: <sec ...

  7. CSS个别属性

    *{ scrollbar-3dlight-color:#fff; // 3d亮色阴影边框(threedlightshadow)的外观颜色 scrollbar-highlight-color:#fff; ...

  8. canvas画布,时钟

    原理代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  9. generator生成器iterator遍历器和yield

    generator方法()返回一个iterator 使用generator时永远先去调用generator()方法 for of对iterator的调用过程(babel参照) 1,_iterator. ...

  10. HTML定位简介

    转载出处 定位一直是WEB标准应用中的难点,如果理不清楚定位那么可能应实现的效果实现不了,实现了的效果可能会走样.如果理清了定位的原理,那定位会让网页实现的更加完美. 定位的定义:在CSS中关于定位的 ...