基于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/<int:task_id>", methods=['GET']) 
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/<int:task_id>', methods=['PUT']) 
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/<int:task_id>',methods=['DELETE'])  
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 
}

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/20458.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论