上一篇文章讲到如何用java实现RESTful服务,这就来说讲怎么用python来实现吧,由于要搭建一套java和python互调的服务,二者都不能少啊。
对于python的述求呢也是要轻量化,而且能快捷开发,由于我这套服务主要控制逻辑仍是在java端,python这块负责一些工具逻辑,好比网页爬取、文字转拼音、图像处理等等,在java端当成工具类来使用,因此轻量和快捷开发就是重点了html
java端须要选择一个web容器,一样的,python也须要选择一个web框架,固然本身实现一套也能够哈,不过本着【人生苦短,我用python】的原则,仍是找框架吧java
知乎上有一个讨论Python 有哪些好的 Web 框架?,从这个讨论中最后我选择了flask,缘由是:python
还有一些其余的就不说了,直到看到一我的作了以下回复,就暂定了flask,再发现flask写RESTful竟然超简单,因而就它了web
选定了flask框架,那就动手写代码咯json
pip install flask
#!/usr/bin/env python # -*- coding: utf-8 -*- # by vellhe 2017/7/9 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!" if __name__ == "__main__": # 这种是不太推荐的启动方式,我这只是作演示用,官方启动方式参见:http://flask.pocoo.org/docs/0.12/quickstart/#a-minimal-application app.run(debug=True)
注:代码里参见的官方文档都是英文的,也有一个不错的中文网站作了很好的翻译,能够在扎个上面找到很好的对应:
http://www.pythondoc.com/flask/quickstart.htmlflask
PostMan验证api
浏览器打开浏览器
完美!!!就这几行代码就实现了一个简单的网页,简直爽得不要不要的了bash
光实现一个简单网页可不是本事(毕竟python用SimpleHTTPServer均可以不用写代码),实现RESTful是否是也一样简单呢?restful
#!/usr/bin/env python # -*- coding: utf-8 -*- # by vellhe 2017/7/9 from flask import Flask, abort, request, jsonify app = Flask(__name__) # 测试数据暂时存放 tasks = [] @app.route('/add_task/', methods=['POST']) def add_task(): if not request.json or 'id' not in request.json or 'info' not in request.json: abort(400) task = { 'id': request.json['id'], 'info': request.json['info'] } tasks.append(task) return jsonify({'result': 'success'}) @app.route('/get_task/', methods=['GET']) def get_task(): if not request.args or 'id' not in request.args: # 没有指定id则返回所有 return jsonify(tasks) else: task_id = request.args['id'] task = filter(lambda t: t['id'] == int(task_id), tasks) return jsonify(task) if task else jsonify({'result': 'not found'}) if __name__ == "__main__": # 将host设置为0.0.0.0,则外网用户也能够访问到这个服务 app.run(host="0.0.0.0", port=8383, debug=True)
以上是经过最原始的方式实现,没有使用flask的RESTful扩展库,就这种实现方式都已经很是给力了,这么一点代码就搞定了RESTful服务,真的是人生苦短啊,但这真的就完美了吗?
答案确定是no啦~ 必需要试试flask的RESTful扩展库才知道什么叫真正的爽啊
flask-restful
强烈建议参考官方文档(由于下面我也是照搬不误):http://flask-restful.readthedocs.io/en/0.3.5/quickstart.html#a-minimal-api
flask-restful
pip install flask-restful
#!/usr/bin/env python # -*- coding: utf-8 -*- # by vellhe 2017/7/9 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)
查询列表:
查询单任务:
添加任务(这是用post表单形式,还能够改为json形式啦):
这个框架用Resource类将封装好了http的各类请求,只需定义一下对应的函数便可,返回值也是能够直接丢对象过去,很是方便,写好接口类用API配置一下路径就搞定了
Perfect!!!通过这一番测试,flask-restful彻底知足了个人需求,框架轻量,开发方便,以class为单位去开发个人各个接口给到java调用,果真是【人生苦短,我用python】啊~