1. 程式人生 > >Flask框架開發RESTful API

Flask框架開發RESTful API

web框架選擇
Django,流行但是笨重,還麻煩,人生苦短,肯定不選

web.py,輕量,但據說作者仙逝無人維護,好吧,先pass

tornado,據說倡導自己造輪子,雖然是facebook開源的吧,但聽到這個,就算了吧

flask,輕量,流行,可以自己定義

安裝flask
pip install flask
flask前端模板引擎預設是jinja2,所以我們還需要安裝jinja2

pip install jinja2

在這裡插入圖片描述

執行python app.py,Flask自帶的Server在埠5000上監聽:

開啟瀏覽器,輸入首頁地址http://localhost:5000/:

會出現hello world

簡單的RESTful實現
在這裡插入圖片描述
驗證結果
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

以上是通過最原始的方式實現,沒有使用flask的RESTful擴充套件庫

使用flask的RESTful擴充套件庫 flask-restful
安裝Flask-RESTful庫:

pip install flask-restful
demo
在這裡插入圖片描述在這裡插入圖片描述
(1)引入需要的庫名、函式、變數等,並做簡單的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提供了一個用於引數解析的RequestParser類,類似於Python中自帶的argparse類,可以很方便的解析請求中的-d引數,並進行型別轉換。

parser = reqparse.RequestParser()
parser.add_argument(‘task’)
(4)我們觀察標準的API介面,這裡的介面可以分為兩類:帶有item_id的,和不帶有item_id的。前者是操作單一資源,後者是操作資源列表或新建一個資源。

從操作單一資源開始,繼承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)繼續操作資源列表,繼承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)資源操作類定義完畢之後,需要設定路由,即告訴Python程式URL的對應關係。

api.add_resource(TodoList, ‘/todos’)
api.add_resource(Todo, ‘/todos/<todo_id>’)
這樣當我們請求url時,就能根據url型別,找到相應的資源類,並呼叫對應方法。

驗證結果
查詢列表:
在這裡插入圖片描述

查詢單任務:
在這裡插入圖片描述

刪除任務:
在這裡插入圖片描述

新增任務(這是用post表單形式,還可以改成json形式啦):
在這裡插入圖片描述

更新任務:

在這裡插入圖片描述