python实现Restful服务 (基于flask)(1)
参考:https://www.jianshu.com/p/6ac1cab17929
参考:https://www.cnblogs.com/alexyuyu/p/6243362.html
参考:http://docs.jinkan.org/docs/flask/quickstart.html.
安装基于REST的Web客户端
1、helloworld的运行
from flask import Flask # Flask初始化参数尽量使用你的包名,这个初始化方式是官方推荐的,官方解释:http://flask.pocoo.org/docs/0.12/api/#flask.Flask app = Flask(__name__) @app.route('/HelloWorld') def hello_world(): return "Hello World!" app.run()
2、使用get 方法获取资源
# -*- coding: utf-8 -*- from flask import Flask, jsonify, abort, make_response app = Flask(__name__) articles = [ { 'id': 1, 'title': 'the way to python', 'content': 'tuple, list, dict' }, { 'id': 2, 'title': 'the way to REST', 'content': 'GET, POST, PUT' } ] @app.route('/blog/api/articles', methods=['GET']) def get_articles(): return jsonify({'articles': articles}) @app.route('/blog/api/articles/<int:article_id>', methods=['GET']) def get_article(article_id): article = filter(lambda a: a['id'] == article_id, articles) if len(article) == 0: abort(404) return jsonify({'article': article[0]}) @app.errorhandler(404) def not_found(error): return make_response(jsonify({'error': 'Not found'}), 404) if __name__ == '__main__': app.run(host='127.0.0.1', port=5632)
在终端输入如下得到结果:
$ curl -i http://localhost:5632/blog/api/articles HTTP/1.0 200 OK Content-Type: application/json Content-Length: 225 Server: Werkzeug/0.12.2 Python/3.6.3 Date: Thu, 22 Mar 2018 15:36:17 GMT { "articles": [ { "content": "tuple, list, dict", "id": 1, "title": "the way to python" }, { "content": "GET, POST, PUT", "id": 2, "title": "the way to REST" } ] }
3、使用flask的RESTful扩展库
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') # Todo # shows a single todo item and lets you delete a todo item 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()
查询列表结果:
查询单任务:
删除任务:
另一个例子:
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') # Todo # shows a single todo item and lets you delete a todo item 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)
通过终端进行如下相应任务:
获取列表:
$ curl http://localhost:5000/todos {"todo1": {"task": "build an API"}, "todo2": {"task": "?????"}, "todo3": {"task": "profit!"}}
获取单个任务:
$ curl http://localhost:5000/todos/todo3 {"task": "profit!"}
删除一个任务:
curl http://localhost:5000/todos/todo2 -X DELETE -v
增加一个任务:
$ curl http://localhost:5000/todos -d "task=something new" -X POST -v
更新一个任务:
$ curl http://localhost:5000/todos/todo3 -d "task=something different" -X PUT -v