web框架選擇
Django睹酌,流行但是笨重权谁,還麻煩,人生苦短憋沿,肯定不選
web.py旺芽,輕量,但據(jù)說(shuō)作者仙逝無(wú)人維護(hù),好吧采章,先pass
tornado运嗜,據(jù)說(shuō)倡導(dǎo)自己造輪子,雖然是facebook開源的吧共缕,但聽到這個(gè)洗出,就算了吧
flask,輕量图谷,流行翩活,可以自己定義
安裝flask
pip install flask
flask前端模板引擎默認(rèn)是jinja2,所以我們還需要安裝jinja2
pip install jinja2
hello world
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def home():
return '<h1>hello world</h1>'
if __name__ == '__main__':
app.run()
運(yùn)行python app.py便贵,F(xiàn)lask自帶的Server在端口5000上監(jiān)聽:
打開瀏覽器菠镇,輸入首頁(yè)地址http://localhost:5000/:
會(huì)出現(xiàn)hello world
簡(jiǎn)單的RESTful實(shí)現(xiàn)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# by vellhe 2017/7/9
from flask import Flask, abort, request, jsonify
app = Flask(__name__)
# 測(cè)試數(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)用戶也可以訪問(wèn)到這個(gè)服務(wù)
app.run(host="0.0.0.0", port=8383, debug=True)
驗(yàn)證結(jié)果
以上是通過(guò)最原始的方式實(shí)現(xiàn)承璃,沒有使用flask的RESTful擴(kuò)展庫(kù)
使用flask的RESTful擴(kuò)展庫(kù) flask-restful
安裝Flask-RESTful庫(kù):
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')
# # 操作(put / get / delete)單一資源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
# # 操作(post / get)資源列表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
# 設(shè)置路由
api.add_resource(TodoList, '/todos')
api.add_resource(Todo, '/todos/<todo_id>')
if __name__ == '__main__':
app.run(debug=True)
(1)引入需要的庫(kù)名利耍、函數(shù)、變量等盔粹,并做簡(jiǎn)單的Application初始化:
from flask import Flask
from flask_restful import reqparse, abort, Api, Resource
app = Flask(__name__)
api = Api(app)
(2)定義我們需要操作的資源類型(都是json格式的):
TODOS = {
'todo1': {'task': 'build an API'},
'todo2': {'task': '哈哈哈'},
'todo3': {'task': 'profit!'},
}
(3)Flask-RESTful提供了一個(gè)用于參數(shù)解析的RequestParser類隘梨,類似于Python中自帶的argparse類刀诬,可以很方便的解析請(qǐng)求中的-d參數(shù)澈蚌,并進(jìn)行類型轉(zhuǎn)換。
parser = reqparse.RequestParser()
parser.add_argument('task')
(4)我們觀察標(biāo)準(zhǔn)的API接口廓脆,這里的接口可以分為兩類:帶有item_id的进萄,和不帶有item_id的捻脖。前者是操作單一資源,后者是操作資源列表或新建一個(gè)資源中鼠。
從操作單一資源開始可婶,繼承Resource類,并添加put / get / delete方法:
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
(5)繼續(xù)操作資源列表援雇,繼承Resource類矛渴,并添加get / post方法:
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
(6)資源操作類定義完畢之后,需要設(shè)置路由熊杨,即告訴Python程序URL的對(duì)應(yīng)關(guān)系曙旭。
api.add_resource(TodoList, '/todos')
api.add_resource(Todo, '/todos/<todo_id>')
這樣當(dāng)我們請(qǐng)求url時(shí),就能根據(jù)url類型晶府,找到相應(yīng)的資源類,并調(diào)用對(duì)應(yīng)方法钻趋。
驗(yàn)證結(jié)果
查詢列表:
查詢單任務(wù):
刪除任務(wù):
添加任務(wù)(這是用post表單形式川陆,還可以改成json形式啦):
更新任務(wù):