Flask 系列之構建 Swagger UI 風格的 WebAPI
阿新 • • 發佈:2019-05-16
ace amp 參考 使用 uniq 說明 virt uil details
說明
- 操作系統:Windows 10
- Python 版本:3.7x
- 虛擬環境管理器:virtualenv
- 代碼編輯器:VS Code
實驗
環境初始化
# 創建項目目錄
mkdir helloworld
cd helloworld
# 創建虛擬環境
python -m virtualenv venv
# 激活虛擬環境
venv\Scripts\activate
# 安裝環境包
pip install flask flask-restplus
# 啟動 VS Code
code .
實驗示例
Hello World
from flask import Flask from flask_restplus import Api, Resource app = Flask(__name__) api_app = Api(app=app, version='1.0', title='Main', description='Main APIs') name_space = api_app.namespace(name='helloworld', description='The helloworld APIs EndPoint.') @name_space.route('/') class HelloWorld(Resource): def get(self): return { 'status': 'you get a request.' } def post(self): return { 'status': 'you post a request.' } if __name__ == "__main__": app.run(debug=True)
程序運行效果如下圖所示:
此時,我們可以通過 Swagger UI 或者 curl 來請求我們上面創建的 一個 get
和 一個 post
請求接口。
參數傳遞
參數傳遞,我們只需要將我們的接口定義添加參數配置即可,如下示例代碼所示:
@name_space.route('/<int:id>') class HelloWorld(Resource): @api_app.doc(responses={ 200: 'ok', 400: 'not found', 500: 'something is error' }, params={ 'id': 'the task identifier' }) def get(self, id): return { 'status': 'you get a request.', 'id': id } def post(self, id): return { 'status': 'you post a request.' }
運行結構如下圖所示:
實體傳遞
在上述兩個示例代碼中,我們知道了如何定義 WebAPI 和 參數傳遞,下面我們摘錄一個官方首頁的 Todo 示例,來完整展示如何使用:
from flask import Flask from flask_restplus import Api, Resource, fields app = Flask(__name__) api = Api(app, version='1.0', title='TodoMVC API', description='A simple TodoMVC API', ) # 配置 API 空間節點 ns = api.namespace('todos', description='TODO operations') # 配置接口數據模型(此數據模型是面向對外服務的,在實際項目中應與數據庫中的數據模型區分開) todo = api.model('Todo', { 'id': fields.Integer(readOnly=True, description='The task unique identifier'), 'task': fields.String(required=True, description='The task details') }) # 定義接口實體 class TodoDAO(object): def __init__(self): self.counter = 0 self.todos = [] def get(self, id): for todo in self.todos: if todo['id'] == id: return todo api.abort(404, "Todo {} doesn't exist".format(id)) def create(self, data): todo = data todo['id'] = self.counter = self.counter + 1 self.todos.append(todo) return todo def update(self, id, data): todo = self.get(id) todo.update(data) return todo def delete(self, id): todo = self.get(id) self.todos.remove(todo) # 創建種子數據 DAO = TodoDAO() DAO.create({'task': 'Build an API'}) DAO.create({'task': '?????'}) DAO.create({'task': 'profit!'}) # 定義服務接口 @ns.route('/') class TodoList(Resource): '''Shows a list of all todos, and lets you POST to add new tasks''' @ns.doc('list_todos') @ns.marshal_list_with(todo) def get(self): '''List all tasks''' return DAO.todos @ns.doc('create_todo') @ns.expect(todo) @ns.marshal_with(todo, code=201) def post(self): '''Create a new task''' return DAO.create(api.payload), 201 # 定義服務接口 @ns.route('/<int:id>') @ns.response(404, 'Todo not found') @ns.param('id', 'The task identifier') class Todo(Resource): '''Show a single todo item and lets you delete them''' @ns.doc('get_todo') @ns.marshal_with(todo) def get(self, id): '''Fetch a given resource''' return DAO.get(id) @ns.doc('delete_todo') @ns.response(204, 'Todo deleted') def delete(self, id): '''Delete a task given its identifier''' DAO.delete(id) return '', 204 @ns.expect(todo) @ns.marshal_with(todo) def put(self, id): '''Update a task given its identifier''' return DAO.update(id, api.payload) if __name__ == '__main__': app.run(debug=True)
程序運行效果如下圖所示:
總結
基於 Flask 而創建 Swagger UI 風格的 WebAPI 包有很多,如
- flasgger
- flask-swagger-ui
- swagger-ui-py
- ...
它們都各有各的優缺點,但是就我目前使用情況來說,還是 Flask-RESTPlus 的構建方式我更喜歡一些,所以我就在這裏分享一下。
最後的最後,安利一下我個人站點:hippiezhou,裏面的 必應壁紙 板塊收錄了每天的必應壁紙,希望你能喜歡。
項目參考
- Working with APIs using Flask, Flask-RESTPlus and Swagger UI
- flask-restplus
Flask 系列之構建 Swagger UI 風格的 WebAPI