前言
上一篇文章講到如何用java實(shí)現(xiàn)RESTful服務(wù)逗嫡,這就來講講怎么用python來實(shí)現(xiàn)吧锦茁,因?yàn)橐罱ㄒ惶譲ava和python互調(diào)的服務(wù)炫隶,兩者都不能少啊。
對(duì)于python的述求呢也是要輕量化仑荐,并且能快捷開發(fā)雕拼,因?yàn)槲疫@套服務(wù)主要控制邏輯還是在java端,python這塊負(fù)責(zé)一些工具邏輯释漆,比如網(wǎng)頁爬取悲没、文字轉(zhuǎn)拼音篮迎、圖像處理等等男图,在java端當(dāng)成工具類來使用示姿,所以輕量和快捷開發(fā)就是重點(diǎn)了
web框架選擇
java端需要選擇一個(gè)web容器,同樣的逊笆,python也需要選擇一個(gè)web框架栈戳,當(dāng)然自己實(shí)現(xiàn)一套也可以哈,不過本著【人生苦短难裆,我用python】的原則子檀,還是找框架吧
知乎上有一個(gè)討論Python 有哪些好的 Web 框架?乃戈,從這個(gè)討論中最后我選擇了flask褂痰,原因是:
- Django,流行但是笨重症虑,還麻煩缩歪,人生苦短,肯定不選
- web.py谍憔,輕量匪蝙,但據(jù)說作者仙逝無人維護(hù),好吧习贫,先pass
- tornado逛球,據(jù)說倡導(dǎo)自己造輪子,雖然是facebook開源的吧苫昌,但聽到這個(gè)颤绕,就算了吧
-
還有一些其他的就不說了,直到看到一個(gè)人做了如下回復(fù)蜡歹,就暫定了flask屋厘,再發(fā)現(xiàn)flask寫RESTful居然超簡單,于是就它了
擼代碼
選定了flask框架月而,那就動(dòng)手寫代碼咯
安裝flask
pip install flask
hello world
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# by vellhe 2017/7/9
from flask import Flask
# Flask初始化參數(shù)盡量使用你的包名汗洒,這個(gè)初始化方式是官方推薦的,官方解釋: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__":
# 這種是不太推薦的啟動(dòng)方式父款,我這只是做演示用溢谤,官方啟動(dòng)方式參見:http://flask.pocoo.org/docs/0.12/quickstart/#a-minimal-application
app.run(debug=True)
注:代碼里參見的官方文檔都是英文的,也有一個(gè)不錯(cuò)的中文網(wǎng)站做了很好的翻譯憨攒,可以在扎個(gè)上面找到很好的對(duì)應(yīng):
http://www.pythondoc.com/flask/quickstart.html
驗(yàn)證結(jié)果:
-
PostMan驗(yàn)證
-
瀏覽器打開
完美J郎薄!肝集!就這幾行代碼就實(shí)現(xiàn)了一個(gè)簡單的網(wǎng)頁瞻坝,簡直爽得不要不要的了
簡單的RESTful實(shí)現(xiàn)
光實(shí)現(xiàn)一個(gè)簡單網(wǎng)頁可不是本事(畢竟python用SimpleHTTPServer都可以不用寫代碼),實(shí)現(xiàn)RESTful是不是也同樣簡單呢杏瞻?
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# by vellhe 2017/7/9
from flask import Flask, abort, request, jsonify
app = Flask(__name__)
# 測試數(shù)據(jù)暫時(shí)存放
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設(shè)置為0.0.0.0所刀,則外網(wǎng)用戶也可以訪問到這個(gè)服務(wù)
app.run(host="0.0.0.0", port=8383, debug=True)
驗(yàn)證結(jié)果
以上是通過最原始的方式實(shí)現(xiàn)衙荐,沒有使用flask的RESTful擴(kuò)展庫,就這種實(shí)現(xiàn)方式都已經(jīng)非常給力了浮创,這么一點(diǎn)代碼就搞定了RESTful服務(wù)忧吟,真的是人生苦短啊,但這真的就完美了嗎斩披?
答案肯定是no啦~ 必須要試試flask的RESTful擴(kuò)展庫才知道什么叫真正的爽啊
使用flask的RESTful擴(kuò)展庫 flask-restful
強(qiáng)烈建議參考官方文檔(因?yàn)橄旅嫖乙彩钦瞻岵徽`):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)
驗(yàn)證結(jié)果
查詢列表:
查詢單任務(wù):
刪除任務(wù):
添加任務(wù)(這是用post表單形式溜族,還可以改成json形式啦):
更新任務(wù):
flask-restful框架使用總結(jié)
這個(gè)框架用Resource類將封裝好了http的各種請求,只需定義一下對(duì)應(yīng)的函數(shù)即可垦沉,返回值也是可以直接丟對(duì)象過去煌抒,非常方便,寫好接口類用API配置一下路徑就搞定了
后語
Perfect2薇丁4菝怠!經(jīng)過這一番測試绑青,flask-restful完全滿足了我的需求诬像,框架輕量,開發(fā)方便闸婴,以class為單位去開發(fā)我的各個(gè)接口給到j(luò)ava調(diào)用坏挠,果然是【人生苦短,我用python】啊~