[转]python实现RESTful服务(基于flask)

python实现RESTful服务(基于flask)

原文: https://www.jianshu.com/p/6ac1cab17929 

前言

上一篇文章讲到如何用java实现RESTful服务,这就来说讲怎么用python来实现吧,由于要搭建一套java和python互调的服务,二者都不能少啊。
对于python的述求呢也是要轻量化,而且能快捷开发,由于我这套服务主要控制逻辑仍是在java端,python这块负责一些工具逻辑,好比网页爬取、文字转拼音、图像处理等等,在java端当成工具类来使用,因此轻量和快捷开发就是重点了html

web框架选择

java端须要选择一个web容器,一样的,python也须要选择一个web框架,固然本身实现一套也能够哈,不过本着【人生苦短,我用python】的原则,仍是找框架吧java

知乎上有一个讨论Python 有哪些好的 Web 框架?,从这个讨论中最后我选择了flask,缘由是:python

  • Django,流行可是笨重,还麻烦,人生苦短,确定不选
  • web.py,轻量,但听说做者仙逝无人维护,好吧,先pass
  • tornado,听说倡导本身造轮子,虽然是facebook开源的吧,但听到这个,就算了吧
  • 还有一些其余的就不说了,直到看到一我的作了以下回复,就暂定了flask,再发现flask写RESTful竟然超简单,因而就它了web


     

撸代码

选定了flask框架,那就动手写代码咯json


安装flask

pip install flask

hello world

#!/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


     
    PostMan验证
  • 浏览器打开浏览器


     
    浏览器打开

完美!!!就这几行代码就实现了一个简单的网页,简直爽得不要不要的了bash


简单的RESTful实现

光实现一个简单网页可不是本事(毕竟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) 
验证结果
 
add_task
 
get_task
 
get_task by id

以上是经过最原始的方式实现,没有使用flask的RESTful扩展库,就这种实现方式都已经很是给力了,这么一点代码就搞定了RESTful服务,真的是人生苦短啊,但这真的就完美了吗?
答案确定是no啦~ 必需要试试flask的RESTful扩展库才知道什么叫真正的爽啊


使用flask的RESTful扩展库 flask-restful

强烈建议参考官方文档(由于下面我也是照搬不误):http://flask-restful.readthedocs.io/en/0.3.5/quickstart.html#a-minimal-api

安装flask-restful
pip install flask-restful
demo
#!/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) 
验证结果

查询列表:


 
get

查询单任务:


 
get by id

删除任务:
 
delete by id

添加任务(这是用post表单形式,还能够改为json形式啦):


 
add

更新任务:
 
update
flask-restful框架使用总结

这个框架用Resource类将封装好了http的各类请求,只需定义一下对应的函数便可,返回值也是能够直接丢对象过去,很是方便,写好接口类用API配置一下路径就搞定了

后语

Perfect!!!通过这一番测试,flask-restful彻底知足了个人需求,框架轻量,开发方便,以class为单位去开发个人各个接口给到java调用,果真是【人生苦短,我用python】啊~

相关文章
相关标签/搜索