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. 【BZOJ1415】【NOI2005】聪聪和可可(动态规划,数学期望)

    [BZOJ1415][NOI2005]聪聪和可可(动态规划,数学期望) 题面 BZOJ 题解 先预处理出当可可在某个点,聪聪在某个点时 聪聪会往哪里走 然后记忆化搜索一下就好了 #include< ...

  2. Luogu3092:[USACO13NOV]No Change

    题面 传送门 Sol 状压一下\(k\),\(f[S]\)表示用过的硬币集合为\(S\)能买到的物品个数 # include <bits/stdc++.h> # define RG reg ...

  3. [SDOI2015]约数个数和

    Sol 首先有个结论 \(\sum_{i=1}^{m}\sum_{j=1}^{n}d(i*j)=\sum_{i=1}^{m}\sum_{j=1}^{n}\sum_{x|i}\sum_{y|i}[gcd ...

  4. 超文本传输​​协议 - HTTP / 1.1(Hypertext Transfer Protocol -- HTTP/1.1)之方法定义(Method Definitions)

    9方法定义 下面定义了HTTP / 1.1的一组常用方法.尽管可以扩展这个集合,但是另外的方法不能假定为单独扩展的客户端和服务器共享相同的语义. 主机请求头域(14.23节)必须伴随所有的HTTP / ...

  5. 【noip模拟】最小点覆盖

    Time Limit: 1000ms      Memory Limit: 128MB Description 最小点覆盖是指在二分图中,用最小的点集覆盖所有的边.当然,一个二分图的最小点覆盖可能有很 ...

  6. Navicat Premium 11破解补丁下载及安装方法

    Navicat Premium 11.x Patch破解补丁 

  7. delphi JPG图片 旋转 切边 缩放

    unit UCutFigure_JPG; //JPG 切图 interface uses Windows, Messages, SysUtils, Variants, Classes, Graphic ...

  8. 《深入理解计算机系统》第7章:重定位PC相对引用的理解

    在第七章<链接>中的静态链接有对符号进行重定位PC相对引用的处理,书上对应的还有公式,但不是很好理解.现做实验对公式进行理解(公式内容如有兴趣可以参考原文)

  9. 解决Centos7本机时间与实际时间相差8小时

    # timedatectl Local -- :: CST Universal -- :: UTC #相差8小时 RTC -- :: Time zone: Asia/Shanghai (CST, +) ...

  10. 自然语言处理中的自注意力机制(Self-attention Mechanism)

    自然语言处理中的自注意力机制(Self-attention Mechanism) 近年来,注意力(Attention)机制被广泛应用到基于深度学习的自然语言处理(NLP)各个任务中,之前我对早期注意力 ...