柚子快报邀请码778899分享:基于Flask的 api(二)
使用flask 构造服务的方法有:
(1)利用路由实现
(2)利用flask的扩展插件实现
利用路由实现REST API
1.GET
获取资源
获取列表
from flask import Flask,request,abort,jsonify
app = Flask(__name__)
tasks = [
{
'id': 1,
'title': u'Buy groceries',
'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
'done': False
},
{
'id': 2,
'title': u'Learn Python',
'description': u'Need to find a good Python tutorial on the web',
'done': False
}
]
@app.route("/tasks", methods=['GET'])
def get_tasks():
return jsonify({'tasks': tasks})
if __name__ == "__main__":
app.run(debug=True)
测试
$ curl -i http://localhost:5000/tasks
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 218 100 218 0 0 931 0 --:--:-- --:--:-- --:--:-- 931HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 218
Server: Werkzeug/1.0.1 Python/3.6.0
Date: Mon, 23 Nov 2020 13:45:24 GMT
{"tasks":[{"description":"Milk, Cheese, Pizza, Fruit, Tylenol","done":false,"id":1,"title":"Buy groceries"},{"description":"Need to find a good Python tutorial on the web","done":false,"id":2,"title":"Learn Python"}]}
获取其中一个
from flask import Flask,request,abort,jsonify
app = Flask(__name__)
tasks = [
{
'id': 1,
'title': u'Buy groceries',
'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
'done': False
},
{
'id': 2,
'title': u'Learn Python',
'description': u'Need to find a good Python tutorial on the web',
'done': False
}
]
@app.route("/tasks/
def get_task(task_id):
task = list(filter(lambda t: t['id'] == task_id, tasks))
if len(task) == 0:
abort(404)
return jsonify({'task': task[0]})
if __name__ == "__main__":
app.run(debug=True)
测试
$ curl -i http://localhost:5000/tasks/1
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 142 100 142 0 0 606 0 --:--:-- --:--:-- --:--:-- 606HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 142
Server: Werkzeug/1.0.1 Python/3.6.0
Date: Mon, 23 Nov 2020 14:31:42 GMT
{
"task": {
"description": "Milk, Cheese, Pizza, Fruit, Tylenol",
"done": false,
"id": 1,
"title": "Buy groceries"
}
}
2.POST
创建资源
from flask import Flask,request,abort,jsonify
app = Flask(__name__)
tasks = [
{
'id': 1,
'title': u'Buy groceries',
'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
'done': False
},
{
'id': 2,
'title': u'Learn Python',
'description': u'Need to find a good Python tutorial on the web',
'done': False
}
]
@app.route('/tasks', methods=['POST'])
def create_task():
if not request.json or not 'title' in request.json:
abort(400)
task = {
'id': tasks[-1]['id'] + 1,
'title': request.json['title'],
'description': request.json.get('description', ""),
'done': False
}
tasks.append(task)
return jsonify({'newTask': task,'list':tasks}), 201
if __name__ == "__main__":
app.run(debug=True)
测试
$ curl -i -H "Content-Type: application/json" -X POST -d '{"title":"ABC"}' http://localhost:5000/tasks
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 528 100 513 100 15 2192 64 --:--:-- --:--:-- --:--:-- 2256HTTP/1.0 201 CREATED
Content-Type: application/json
Content-Length: 513
Server: Werkzeug/1.0.1 Python/3.6.0
Date: Mon, 23 Nov 2020 14:38:50 GMT
{
"list": [
{
"description": "Milk, Cheese, Pizza, Fruit, Tylenol",
"done": false,
"id": 1,
"title": "Buy groceries"
},
{
"description": "Need to find a good Python tutorial on the web",
"done": false,
"id": 2,
"title": "Learn Python"
},
{
"description": "",
"done": false,
"id": 3,
"title": "ABC"
}
],
"newTask": {
"description": "",
"done": false,
"id": 3,
"title": "ABC"
}
}
3.PUT
更新资源
from flask import Flask,request,abort,jsonify
app = Flask(__name__)
tasks = [
{
'id': 1,
'title': u'Buy groceries',
'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
'done': False
},
{
'id': 2,
'title': u'Learn Python',
'description': u'Need to find a good Python tutorial on the web',
'done': False
}
]
@app.route('/tasks/
def update_task(task_id):
task = list(filter(lambda t:t['id']==task_id,tasks))
if len(task)==0:
abort(404)
if not request.json:
abort(400)
if 'title' in request.json and not isinstance(request.json['title'],str):
abort(400)
if 'description' in request.json and not isinstance(request.json['description'],str):
abort(400)
if 'done' in request.json and not isinstance(request.json['done'],bool):
abort(400)
task[0]['title'] = request.json.get('title',task[0]['title'])
task[0]['description'] = request.json.get('description', task[0]['description'])
task[0]['done'] = request.json.get('done', task[0]['done'])
return jsonify({'task':task[0]})
if __name__ == "__main__":
app.run(debug=True)
测试
$ curl -i -H "Content-Type: application/json" -X PUT -d '{"title":"ABC"}' http://localhost:5000/tasks/1
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 147 100 132 100 15 564 64 --:--:-- --:--:-- --:--:-- 628HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 132
Server: Werkzeug/1.0.1 Python/3.6.0
Date: Mon, 23 Nov 2020 15:00:31 GMT
{
"task": {
"description": "Milk, Cheese, Pizza, Fruit, Tylenol",
"done": false,
"id": 1,
"title": "ABC"
}
}
4.DELETE
删除资源
from flask import Flask,request,abort,jsonify
app = Flask(__name__)
tasks = [
{
'id': 1,
'title': u'Buy groceries',
'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
'done': False
},
{
'id': 2,
'title': u'Learn Python',
'description': u'Need to find a good Python tutorial on the web',
'done': False
}
]
@app.route('/tasks/
def delete_task(task_id):
task = list(filter(lambda t: t['id']==task_id,tasks))
if len(task) ==0:
abort(404)
tasks.remove(task[0])
return jsonify({'result': True,'list':tasks})
if __name__ == "__main__":
app.run(debug=True)
测试
$ curl -i -H "Content-Type: application/json" -X DELETE http://localhost:5000/tasks/1
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 191 100 191 0 0 812 0 --:--:-- --:--:-- --:--:-- 812HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 191
Server: Werkzeug/1.0.1 Python/3.6.0
Date: Mon, 23 Nov 2020 15:02:52 GMT
{
"list": [
{
"description": "Need to find a good Python tutorial on the web",
"done": false,
"id": 2,
"title": "Learn Python"
}
],
"result": true
}
柚子快报邀请码778899分享:基于Flask的 api(二)
发表评论