[轉]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】啊~

相關文章
相關標籤/搜索