剛好這周上班我研究了 Flask,所以在此紀錄一下跟大家分享。而文章中
自行撰寫的 Python 模組,是上一篇:Jupyter Notebook Server API 筆記(2),內容中的 Python 程式所整理的。那麼為什麼我要創建個 Web API,是因為想把自己撰寫的 Python 模組,透過 Web API 讓他人可以使用。
什麼是 Web API?
首先要創建 Web API 前,就要先知道 API 是什麼?API,Application Programming Interface,中文稱為:應用程式介面。它是一段程式碼
與作業系統、與其他段程式碼彼此之間溝通的管道。 像是作業系統的 API、資料庫系統的 API、電腦硬體的 API 或者軟體應用程式的 API。
而筆者要建構於網站應用程式的 API,它就是 Web API。
什麼是 Flask?
Python 有許多能用於創建 Web 應用程式和 Web API 的框架,Flask 就是
其中一個,它與著名的 Django 最大的不同是其 Web 應用框架十分輕量。
雖然 Django 具有完整的專案架構並包含許多內建工具的框架,但對於
筆者的需求有點太多了,所以選擇輕量的 Flask,它就能完成 Web API 的
需求:管理 HTTP 請求和顯示資料內容。
開始來安裝
因為 Flask 是由 Python 所編寫的,所以第一步是先確定你有沒有安裝了
Python。如果沒有,可以參考我第一篇的文章:Jupyter Notebook Server API 筆記(1)
安裝好 Python,我們就可以來安裝 Flask。我們使用 pip (Python 編寫的
軟體包管理系統)來安裝。 開啟 cmd (命令提示字元),並輸入 “pip install Flask”,即可安裝完畢。
Web API 實作流程與介紹
接著我會撰寫三支 Python 程式,以達到 Web API 的效果。至於 Flask 的
基礎教學,我這邊就不多著墨了,如有想了解的人可以前往這篇,此位
大大寫的很詳細: https://medium.com/datainpoint/flask-web-api-quickstart-3b13d96cccc2。
那麼請讀者看下面圖片:
module.py:編寫一些模組,供外部程式使用。
api.py:Web API 的主程式,使用 Flask 來建構。
demo.py:測試 Web API 效果的程式檔。
所以流程會是:api.py 先 run 起來,讓我們的 Web API 處於持續服務的
階段,而 api.py 裡面的函式有使用到的模組,都是來自於 module.py。
最後跑 demo.py,去測試 Web API 是否可以傳回我們請求的資料。
Web API 開始實作!
筆者把三支程式都放在同一個資料夾底下:
首先模組的部分(module.py),為了講解清晰所以我只放了一組模組,
而這個模組是把指定的 Jupyter Notebook 檔案讀取下來。notebook_path、base、headers,是要餵進來的變數,分別是:notebook 檔案路徑、jupyter 網址、Token。我們需要這些變數才可以 request 進而拿到我們要的資料。特別的是 response.text 為 JSON 格式,所以我們需要使用 json.loads 把 JSON 格式轉為 dict格式(字典),讓 Python 程式使用。
import json
import requests# 讀取Jupyter Notebook檔案的內容
def get_content_of_notebook(notebook_path, base, headers):
url = base + '/api/contents' + notebook_path
response = requests.get(url, headers=headers)
file = json.loads(response.text)return file['content']
接下來是重點 Web API 的部分(api.py),一開始我們會從 flask 匯入 Flask、jsonify、request 來使用,而第二行是匯入自行撰寫的模組。
先跳過中間我們來看到最後一段:if __name__ == ‘__main__’ 這是當我們拿 api.py 當作主程式執行時,Python 預設變數 __name__ 會是 ‘__main__’
所以會執行 app.run() 這段 code,讓 Web API 跑起來;反之,如果 api.py
非當主程式,像是被當作模組使用時,Web API 就不會跑起來了。
app.route 為路由,我們自由設定個位置,讓其他人可以藉由這個位置,
去使用 content_notebook 這個函式。比較特別的是前面的老鼠符號,它
被稱之為裝飾符號(Decorator),它是以函式為基礎,提供附加的功能。
接著在函式裡面,你會看到 request.get_json(),它是把 request 過來的 JSON 內容獲取下來,並轉換成 dict 格式,而這些變數都將是提供給
匯入的模組使用。最後,return jsonify(content) 是把 Notebook 檔案資料
回傳回去。特別的是 jsonify 功能:把資料轉換成 JSON 格式。
from flask import Flask, jsonify, request
import moduleapp = Flask(__name__)
app.config["DEBUG"] = True@app.route('/api/content', methods=['POST'])
def content_notebook():
data = request.get_json()
notebook_path = data['notebook_path']
base = data['base']
headers = data['headers']content = module.get_content_of_notebook(notebook_path, base, headers)return jsonify(content)if __name__ == '__main__':
app.run()
模組 和 Web API 都完成後 ,我們就要來使用 demo.py 進行測試了!
body 是放我們要餵給 Web API 的參數,它們將會被 Web API 裡的模組
使用。因為它們是 JSON 格式,所以是 json=body 來接收。
至於 url_contents,就是我們獲取 Notebook 檔案資料的網址。request 會
經由 url_contents 這網址向相對應的函式提出請求,而我們這邊 request
的方法是 POST,所以寫成 requests.post。最後 Web API 會回傳 Notebook 檔案資料,我們再把它 print 出來看結果。
import requestsbody = {
'notebook_path': '/work/new_file.ipynb',
'base': 'http://127.0.0.1:8888/',
'headers': {'Authorization': 'Token 1c129e97ea3cbfa139d95912587fbbea038b35abaaf247e7'}
}url_contents = 'http://127.0.0.1:5000/api/content'contents = requests.post(url_contents, json=body)
print(contents.text)
Web API 測試結果!
開啟兩個 cmd (命令提示字元),一個執行 api.py,一個執行 demo.py
我們先開啟 api.py,讓 Web API 服務開始!請拖拉 api.py 到 cmd 視窗
並按下 Enter 鍵。出現以下訊息就代表運行成功!
接著,我們拖拉 demo.py 到cmd 視窗,並按下 Enter 鍵。就會看到 Notebook 檔案資料以 JSON 格式,列印在 cmd 視窗上。這樣子我們
即完成了一個簡單的 Web API 功能。但切記!若想要停止 Web API 的
服務時,請在跑 Web API(api.py) 的 cmd 視窗中,按下 Ctrl+C,即可
停下 Web API 服務,不然程式沒中斷,Web API 服務將永遠不會終止。
以上,是我研究如何使用 Flask 搭建 Web API 的成果,希望對閱讀者的你
有所幫助。如果有什麼相關問題,歡迎在底下留言,我們互相交流交流~
未來也會持續更新文章,把近期所學跟大家分享,請大家持續關注哦^^