Flask 学习-23.restful 接口开发
前言
Flask-RESTful 是一个 Flask 扩展,它添加了快速构建 REST APIs 的支持。它当然也是一个能够跟你现有的ORM/库协同工作的轻量级的扩展。 Flask-RESTful 鼓励以最小设置的最佳实践。如果你熟悉 Flask 的话,Flask-RESTful 应该很容易上手。
环境准备
使用 pip 安装 Flask-RESTful:
pip install flask-restful
中文官方文档:http://www.pythondoc.com/Flask-RESTful/quickstart.html 英文官网:https://flask-restful.readthedocs.io/en/latest/
快速入门
一个最简单的 Flask-RESTful API 像这样:
from flask import Flask
from flask.ext import restful
app = Flask(__name__)
api = restful.Api(app)
class HelloWorld(restful.Resource):
def get(self):
return {'hello': 'world'}
api.add_resource(HelloWorld, '/')
if __name__ == '__main__':
app.run(debug=True)
但是运行会发现有报错:ModuleNotFoundError: No module named ‘flask.ext’
原因:新版的 flask 不再支持 ‘flask.ext’,需要换种方式导入相应第三方库(说明官网很久没更新了)
解决办法:把 ‘.ext’改写为下划线’_’ 于是把原来的
from flask.ext import restful
改成新的导入方式
import flask_restful as restful
其它类似的导入’flask.ext’, 也可以改成_, 如下示例
from flask.ext.bootstrap import Bootstrap
改为:from flask_bootstrap import Bootstrap
重新启动后访问http://127.0.0.1:5000/
基于资源(Resources)的路由
Flask-RESTful 提供的最主要的基础就是资源(resources)。资源(Resources)是构建在 Flask 可拔插视图 之上,只要在你的资源(resource)上定义方法就能够容易地访问多个 HTTP 方法。 一个待办事项应用程序的基本的 CRUD(增删改查) 资源看起来像这样:
from flask import Flask, request
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
todos = {}
class TodoSimple(Resource):
def get(self, todo_id):
return {todo_id: todos[todo_id]}
def put(self, todo_id):
todos[todo_id] = request.form['data']
return {todo_id: todos[todo_id]}
api.add_resource(TodoSimple, '/<string:todo_id>')
if __name__ == '__main__':
app.run(debug=True)
Flask-RESTful 支持视图方法多种类型的返回值。同 Flask 一样,你可以返回任一迭代器,它将会被转换成一个包含原始 Flask 响应对象的响应。
Flask-RESTful 也支持使用多个返回值来设置响应代码和响应头,如下所示:
class Todo1(Resource):
def get(self):
# Default to 200 OK
return {'task': 'Hello world'}
class Todo2(Resource):
def get(self):
# Set the response code to 201
return {'task': 'Hello world'}, 201
class Todo3(Resource):
def get(self):
# Set the response code to 201 and return custom headers
return {'task': 'Hello world'}, 201, {'Etag': 'some-opaque-string'}
端点(Endpoints)
很多时候在一个 API 中,你的资源可以通过多个 URLs 访问。你可以把多个 URLs 传给 Api 对象的 Api.add_resource() 方法。每一个 URL 都能访问到你的 Resource
api.add_resource(HelloWorld,
'/',
'/hello')
你也可以为你的资源方法指定 endpoint 参数。
api.add_resource(Todo,
'/todo/<int:todo_id>', endpoint='todo_ep')
格式化完整例子
from flask import Flask
from flask_restful import reqparse, abort, Api, Resource
app = Flask(__name__)
api = Api(app)
TODOS = {
'todo1': {'task': 'build an API'},
'todo2': {'task': '?????'},
'todo3': {'task': 'profit!'},
}
def abort_if_todo_doesnt_exist(todo_id):
if todo_id not in TODOS:
abort(404, message="Todo {} doesn't exist".format(todo_id))
parser = reqparse.RequestParser()
parser.add_argument('task', type=str)
# Todo
# show a single todo item and lets you delete them
class Todo(Resource):
def get(self, todo_id):
abort_if_todo_doesnt_exist(todo_id)
return TODOS[todo_id]
def delete(self, todo_id):
abort_if_todo_doesnt_exist(todo_id)
del TODOS[todo_id]
return '', 204
def put(self, todo_id):
args = parser.parse_args()
task = {'task': args['task']}
TODOS[todo_id] = task
return task, 201
# TodoList
# shows a list of all todos, and lets you POST to add new tasks
class TodoList(Resource):
def get(self):
return TODOS
def post(self):
args = parser.parse_args()
todo_id = int(max(TODOS.keys()).lstrip('todo')) + 1
todo_id = 'todo%i' % todo_id
TODOS[todo_id] = {'task': args['task']}
return TODOS[todo_id], 201
##
## Actually setup the Api resource routing here
##
api.add_resource(TodoList, '/todos')
api.add_resource(Todo, '/todos/<todo_id>')
if __name__ == '__main__':
app.run(debug=True)
2022年第 12期《python接口web自动化+测试开发》课程,9月17号开学!
本期上课时间:2022年9月17号 - 2022年12月17号,周六周日上午9:00-11:00
报名费:报名费3000一人(周期3个月)
联系微信/QQ:283340479
相关文章
- RESTful风格的应用
- Flask 学习-38.Flask-RESTful 序列化输出中文显示问题
- Flask 学习-35.restful-full 自定义错误内容 error_msg 使用
- Flask 学习-33.restful-full 请求参数校验reqparse.RequestParser()
- 使用 Vue + LayUI 做后台管理、RESTful 交互
- 写出优雅的Restful风格API
- restful接口定义_主板上的spi接口接什么
- MySQL Router Restful API (中文)
- RESTful API 主流API风格
- 通用Restful API项目模板
- 【DRF】快速入门,使用DjangoRestFrameWork自动生成Restful风格的增删改查代码和接口文档!
- [开源推荐] 基于yii2的restful接口自动生成在线文档
- k8sailor - 05 设计 RESTful API 和 HTTP 响应数据
- 【ES三周年】Elasticsearch原理深入浅出 — RESTful/ 倒排索引/ BKD树
- Go-RESTful-处理请求和响应(一)
- Go-RESTful-设计API接口(二)
- 使用Java创建RESTful Web Service详解架构师
- springmvc 构造RESTful URL详解编程语言
- SpringBoot+MySQL+MyBatis(Mapper.xml方式)实现简单的多表CRUD(RESTful风格HTTP接口)详解编程语言
- 一个用 Java 实现的超轻量级 RESTful Web 服务示例
- 高性能web服务器框架Tornado简单实现restful接口及开发实例