flask-restful使用指南
from flask import Flask
from flask_restful import Resource, Api app = Flask(__name__)
api = Api(app) class TestRestful(Resource):
def get(self):
return {'hello': 'restful'} api.add_resource(TestRestful, '/') if __name__ == '__main__':
app.run()
演示结果
C:\Users\jh>curl http://127.0.0.1:5000/
{"hello": "restful"}
Flask-RESTful 提供的主要构建块是资源。资源构建在 Flask 可插入视图之上,
只需在资源上定义方法,就可以轻松访问多个 HTTP 方法。一个 todo 应用程序的基本 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()
演示结果
执行
curl http://127.0.0.1:5000/todo1 -d "data=hello restful" -X put
返回 {"todo1": "hello restful"}
执行 curl http://127.0.0.1:5000/todo1
返回 {"todo1": "hello restful"}
curl http://127.0.0.1:5000/todo2 -d "data=good restful" -X put
返回 {"todo2": "good restful"}
执行 curl http://127.0.0.1:5000/todo2
返回 {"todo2": "good restful"}
Restful 能够从 view 方法中理解多种返回值。类似于 Flask,你可以返回任何可迭代的并且它将被转换成一个响应,
包括原始 Flask 响应对象。还支持使用多个返回值设置响应代码和响应头,如下所示:
from flask import Flask
from flask_restful import Resource, Api app = Flask(__name__)
api = Api(app) class Todo1(Resource):
def get(self):
return {'msg': 'hello restful'} class Todo2(Resource):
def get(self):
return {'msg': 'hello restful'}, 201 class Todo3(Resource):
def get(self):
return {'msg': 'hello restful'}, 201, {'new_tag': 'this is new_tag'} api.add_resource(Todo1, '/todo1')
api.add_resource(Todo2, '/todo2')
api.add_resource(Todo3, '/todo3')
if __name__ == '__main__':
app.run()
演示结果
C:\Users\jh>curl -i http://127.0.0.1:5000/todo1
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 25
Server: Werkzeug/2.0.1 Python/3.8.6
Date: Tue, 16 Aug 2022 10:25:25 GMT
{"msg": "hello restful"} # return 的msg
很多时候,在一个 API 中,你的资源会有多个 url。可以将多个 url 传递给 Api 对象上的 add _ resource ()方法。
每一个都将被路由到Resource
from flask import Flask
from flask_restful import Resource, Api app = Flask(__name__)
api = Api(app) class TestRestful(Resource):
def get(self):
return {'hello': 'restful'} class Todo(Resource):
def get(self, todo_id):
return {'msg': 'hello todo'} api.add_resource(TestRestful, '/', '/test')
api.add_resource(Todo, '/todo/<int:todo_id>', endpoint='todo_ep') if __name__ == '__main__':
app.run()
演示结果
C:\Users\jh>curl -i http://127.0.0.1:5000/todo2
HTTP/1.0 201 CREATED # return的状态码
Content-Type: application/json
Content-Length: 25
Server: Werkzeug/2.0.1 Python/3.8.6
Date: Tue, 16 Aug 2022 10:25:27 GMT
{"msg": "hello restful"} # return 的msg
C:\Users\jh>curl -i http://127.0.0.1:5000/todo3
HTTP/1.0 201 CREATED # return的状态码
Content-Type: application/json
Content-Length: 25
new_tag: this is new_tag #return 的new_tag
Server: Werkzeug/2.0.1 Python/3.8.6
Date: Tue, 16 Aug 2022 10:25:32 GMT
{"msg": "hello restful"} # return 的msg
C:\Users\jh>curl -i http://127.0.0.1:5000/
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 21
Server: Werkzeug/2.0.1 Python/3.8.6
Date: Tue, 16 Aug 2022 10:58:32 GMT
{"hello": "restful"}
C:\Users\jh>curl -i http://127.0.0.1:5000/test
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 21
Server: Werkzeug/2.0.1 Python/3.8.6
Date: Tue, 16 Aug 2022 10:58:42 GMT
{"hello": "restful"}
C:\Users\jh>curl -i http://127.0.0.1:5000/todo/1
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 22
Server: Werkzeug/2.0.1 Python/3.8.6
Date: Tue, 16 Aug 2022 10:59:02 GMT
{"msg": "hello todo"}
C:\Users\jh>curl -i http://127.0.0.1:5000/todo/2
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 22
Server: Werkzeug/2.0.1 Python/3.8.6
Date: Tue, 16 Aug 2022 10:59:06 GMT
{"msg": "hello todo"}
虽然 Flask 可以方便地访问请求数据(即 querystring 或 POST 表单编码的数据) ,
但验证表单数据仍然是一件痛苦的事情。使用类似于 argparse 的库对请求数据验证提供内置支持。
from flask import Flask
from flask_restful import reqparse, Resource, Api
app = Flask(__name__)
api = Api(app) parser = reqparse.RequestParser()
parser.add_argument('rate', type=int, help='rate to change for this resource') class Todo(Resource):
def post(self):
args = parser.parse_args()
print('args: %s' % args)
return {'msg': 'hello333 restful'} def get(self):
args = parser.parse_args()
print('args: %s' % args)
return {'msg': 'hello444 restful'} api.add_resource(Todo, '/todos') if __name__ == '__main__':
app.run(debug=True)
演示结果
使用curl时,-d 后面的参数需要用双引号,否则可能获取不到参数
C:\Users\jh>curl -H "charset=utf-8" -d 'rate=110' http://127.0.0.1:5000/todos
{
"msg": "hello333 restful"
}
C:\Users\jh>curl -d "rate=123" http://127.0.0.1:5000/todos
{
"msg": "hello333 restful"
}
C:\Users\jh>curl -d "rate=123s" http://127.0.0.1:5000/todos
{
"message": {
"rate": "rate to change for this resource"
}
}
C:\Users\jh>curl http://127.0.0.1:5000/todos?rate=234
{
"msg": "hello444 restful"
}
C:\Users\jh>curl http://127.0.0.1:5000/todos?rate2=234
{
"msg": "hello444 restful"
}
服务端日志
127.0.0.1 - - [18/Aug/2022 11:04:44] "POST /todos HTTP/1.1" 200 -
args: {'rate': None}
127.0.0.1 - - [18/Aug/2022 11:04:51] "POST /todos HTTP/1.1" 200 -
args: {'rate': None}
127.0.0.1 - - [18/Aug/2022 11:04:54] "POST /todos HTTP/1.1" 200 -
args: {'rate': 123}
127.0.0.1 - - [18/Aug/2022 11:05:30] "POST /todos HTTP/1.1" 400 -
args: {'rate': 234}
127.0.0.1 - - [18/Aug/2022 11:06:08] "GET /todos?rate=234 HTTP/1.1" 200 -
127.0.0.1 - - [18/Aug/2022 11:06:12] "GET /todos?rate2=234 HTTP/1.1" 200 -
args: {'rate': None}
默认情况下,在你的返回迭代中所有字段将会原样呈现。尽管当你刚刚处理 Python 数据结构的时候,觉得这是一个伟大的工作,
但是当实际处理它们的时候,会觉得十分沮丧和枯燥。为了解决这个问题,Flask-RESTful 提供了 fields 模块和 marshal_with() 装饰器。
类似 Django ORM 和 WTForm,你可以使用 fields 模块来在你的响应中格式化结构。
from flask import Flask
from flask_restful import Resource, Api, fields, marshal_with
app = Flask(__name__)
api = Api(app) resource_fields = {
'task': fields.String,
'uri': fields.Url('todo')
} class TodoDao(object):
def __init__(self, todo_id, task):
self.todo_id = todo_id
self.task = task
self.status = 'active' class Todo(Resource):
@marshal_with(resource_fields)
def get(self, **kwargs):
return TodoDao(todo_id='my_todo', task='watch the car') api.add_resource(Todo, '/todo') if __name__ == '__main__':
app.run(debug=True)
C:\Users\jh>curl http://127.0.0.1:5000/todo
{
"task": "watch the car",
"uri": "/todo"
}
from flask import Flask
from flask_restful import Resource, Api, reqparse, abort
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') 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 class TodoList(Resource):
def get(self, **kwargs):
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 api.add_resource(TodoList, '/todos')
api.add_resource(Todo, '/todos/<todo_id>') if __name__ == '__main__':
app.run(debug=True)
演示结果
C:\Users\jh>curl http://127.0.0.1:5000/todos
{
"todo1": {
"task": "build an api"
},
"todo2": {
"task": "??????"
},
"todo3": {
"task": "profit!"
}
}
C:\Users\jh>curl http://127.0.0.1:5000/todos/todo3
{
"task": "profit!"
}
C:\Users\jh>curl http://127.0.0.1:5000/todos/todo4
{
"message": "Todo todo4 doesn't exist"
}
C:\Users\jh>curl http://localhost:5000/todos/todo2 -X DELETE -v
* Trying 127.0.0.1:5000...
* Connected to localhost (127.0.0.1) port 5000 (#0)
> DELETE /todos/todo2 HTTP/1.1
> Host: localhost:5000
> User-Agent: curl/7.83.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
* HTTP 1.0, assume close after body
< HTTP/1.0 204 NO CONTENT
< Content-Type: application/json
< Server: Werkzeug/2.0.1 Python/3.8.6
< Date: Thu, 18 Aug 2022 06:10:09 GMT
<
* Closing connection 0
C:\Users\jh>curl http://127.0.0.1:5000/todos/todo2
{
"message": "Todo todo2 doesn't exist"
}
C:\Users\jh>curl http://localhost:5000/todos -d "task=something new" -X POST -v
Note: Unnecessary use of -X or --request, POST is already inferred.
* Trying 127.0.0.1:5000...
* Connected to localhost (127.0.0.1) port 5000 (#0)
> POST /todos HTTP/1.1
> Host: localhost:5000
> User-Agent: curl/7.83.1
> Accept: */*
> Content-Length: 18
> Content-Type: application/x-www-form-urlencoded
>
* Mark bundle as not supporting multiuse
* HTTP 1.0, assume close after body
< HTTP/1.0 201 CREATED
< Content-Type: application/json
< Content-Length: 32
< Server: Werkzeug/2.0.1 Python/3.8.6
< Date: Thu, 18 Aug 2022 06:10:53 GMT
<
{
"task": "something new"
}
* Closing connection 0
C:\Users\jh>curl http://127.0.0.1:5000/todos/todo4
{
"task": "something new"
}
C:\Users\jh>curl http://localhost:5000/todos/todo3 -d "task=something different" -X PUT -v
* Trying 127.0.0.1:5000...
* Connected to localhost (127.0.0.1) port 5000 (#0)
> PUT /todos/todo3 HTTP/1.1
> Host: localhost:5000
> User-Agent: curl/7.83.1
> Accept: */*
> Content-Length: 24
> Content-Type: application/x-www-form-urlencoded
>
* Mark bundle as not supporting multiuse
* HTTP 1.0, assume close after body
< HTTP/1.0 201 CREATED
< Content-Type: application/json
< Content-Length: 38
< Server: Werkzeug/2.0.1 Python/3.8.6
< Date: Thu, 18 Aug 2022 06:15:31 GMT
<
{
"task": "something different"
}
* Closing connection 0
C:\Users\jh>curl http://127.0.0.1:5000/todos/todo3
{
"task": "something different"
}
C:\Users\jh>curl http://127.0.0.1:5000/todos
{
"todo1": {
"task": "build an api"
},
"todo3": {
"task": "something different"
},
"todo4": {
"task": "something new"
}
}
flask-restful使用指南的更多相关文章
- Python Flask Restful
Flask Restful 1.flask restful 在flask基础上进行一些封装,主要用于实现restful接口 2.restful的理解 1)URI(统一资源标识符):每一个URI代表一 ...
- 使用swagger 生成 Flask RESTful API
使用swagger 生成 Flask RESTful API http://www.voidcn.com/article/p-rcvzjvpf-e.html swagger官网 https://swa ...
- Flask restful源码分析
Flask restful的代码量不大,功能比较简单 参见 http://note.youdao.com/noteshare?id=4ef343068763a56a10a2ada59a019484
- 如何用rflask快速初始化Flask Restful项目
如何用rflask快速初始化Flask Restful项目 说明 多啰嗦两句 我们在创建flask项目的时候,使用pycharm创建出来的项目比较简陋,而且随着项目的功能完善,项目目录结构会比较多,多 ...
- [flask]Restful接口测试简单的应用
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : shenqiang from flask import Flask,make_res ...
- 快速创建Flask Restful API项目
前言 Python必学的两大web框架之一Flask,俗称微框架.它只需要一个文件,几行代码就可以完成一个简单的http请求服务. 但是我们需要用flask来提供中型甚至大型web restful a ...
- python Flask restful框架
框架地址:https://github.com/flask-restful/flask-restful 文档:http://flask-restful.readthedocs.io/en/0.3.5/ ...
- Flask RESTful API搭建笔记
之前半年时间,来到项目的时候,已经有一些东西,大致就是IIS+MYSQL+PHP. 所以接着做,修修补补,Android/iOS与服务器数据库交换用PHP, Web那边则是JS+PHP,也没有前后端之 ...
- 七十八:flask.Restful之flask-Restful标准化返回参数以及准备数据
对于一个视图函数,可以指定好数据结构和字段用于返回,以后使用ORM模型或者自定义的模型的时候,它会自动获取模型中相应的字段,生成json数据,然后再返回给前端,这需要导入flask_restful.m ...
- Flask Restful Small Demo
参考: http://www.pythondoc.com/flask-restful/first.html 什么是Rest Client-Server:服务器端与客户端分离. Stateless(无状 ...
随机推荐
- 前端5jQuery
内容概要 jQuery简介 查找标签 jQuery操作标签 jQuery事件操作 jQuery动画效果(了解) 前端第三方框架(基础) 内容详情 jQuery简介
- JVM学习笔记-从底层了解程序运行(二)
解决JVM运行中的问题 一个案例理解常用工具 测试代码: /** * 从数据库中读取信用数据,套用模型,并把结果进行记录和传输 */ public class T15_FullGC_Problem01 ...
- 想写个小说,关于C#的,名字就叫《原Csharp》吧 (第一回 买书未成炁自生 惶惶回屋遇老翁)
以前也有写过一些小说,但是总是写写停停的,因为忙于项目和其他事情,总是耽搁很久(真的是很久)才会继续动两笔,所以我想先在这里以随笔的方式写个关于C#异世界的小故事吧,更新随缘,也稍微能让自己轻松些. ...
- JS:eval
定义和用法: eval() 函数计算 JavaScript 字符串,并把它作为脚本代码来执行.eval()函数并不会创建一个新的作用域,并且它的作用域就是它所在的作用域. 如果参数是一个表达式,eva ...
- TypeScript(5)类、继承、多态
前言 对于传统的 JavaScript 程序我们会使用函数和基于原型的继承来创建可重用的组件,但对于熟悉使用面向对象方式的程序员使用这些语法就有些棘手,因为他们用的是基于类的继承并且对象是由类构建出来 ...
- 使用React.js写一个类似单选框与复选框的功能
单选框 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <tit ...
- RPA应用场景-定点取数
场景概述定点取数 所涉系统名称业务系统,Excel 人工操作(时间/次) 8 小时 所涉人工数量 2 操作频率实时 场景流程 1.从业务系统中拉取指定字段值的数据填入Excel: 2.将Excel每隔 ...
- Linux 源码编译安装软件
程序包编译安装的步骤: 源代码-->预处理-->编译-->汇编-->链接-->执行 多文件:文件中的代码之间,很可能存在跨文件依赖关系 1.编译源码的项目工具 使用相关的 ...
- Windows 通过本地计算机IP链接Mysql设置
前言 1.Mysql-1130错误:无法远程连接 错误:ERROR 1130: Host '192.168.1.3' is not allowed to connect to thisMySQL se ...
- Tomcat深入浅出——Filter与Listener(五)
一.Filter过滤器 1.1 Filter过滤器的使用 这是过滤器接口的方法 public interface Filter { default void init(FilterConfig fil ...