前言:
Flask是一個使用 Python 編寫的輕量級 Web 應用框架。其 WSGI 工具箱採用 Werkzeug ,模板引擎則使用 Jinja2 。特別的是,Flask是一個輕量級的可定製框架,使用Python語言編寫,較其他同類型框架更爲靈活、輕便、安全且容易上手。它可以很好地結合MVC模式進行開發,開發人員分工合作,小型團隊在短時間內就可以完成功能豐富的中小型網站或Web服務的實現。
一.Flask的安裝
在win10系統下,直接使用pip安裝即可:
pip install flask
二.快速入門
我們首先來打印一下“Hello World!”:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
在Pycharm中運行上述代碼,會得到如下結果:
使用瀏覽器訪問http://127.0.0.1:5000/ ,你會看見Hello World問候。
那麼,上述代碼做了什麼?
首先,我們導入了 Flask 類。這個類的實例將會是我們的 WSGI 應用程序。
接下來,我們創建一個該類的實例,第一個參數是應用模塊或者包的名稱。 如果你使用單一的模塊(如本例),你應該使用 __name__ ,因爲模塊的名稱將會因其作爲單獨應用啓動還是作爲模塊導入而有不同( 也即是 '__main__' 或實際的導入名)。這是必須的,這樣 Flask 才知道到哪去找模板、靜態文件等等。詳情見 Flask 的文檔。
然後,我們使用 route() 裝飾器告訴 Flask 什麼樣的URL 能觸發我們的函數。
這個函數的名字也在生成 URL 時被特定的函數採用,這個函數返回我們想要顯示在用戶瀏覽器中的信息。
最後我們用 run() 函數來讓應用運行在本地服務器上。 其中 if __name__ == '__main__': 確保服務器只會在該腳本被 Python 解釋器直接執行的時候纔會運行,而不是作爲模塊導入的時候。
三.文件上傳
終於到了我們需要解決的問題了,在本次應用中,需要使用Flask在PaaS平臺上搭建一個web服務,需要接受用戶發送給來的圖片。
3.1代碼
from flask import request, Flask, jsonify
from matplotlib import pyplot as plt
app = Flask(__name__)
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'bmp'])
@app.route('/', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
# 使用request上傳文件,其中‘file'表示前端表單的Key值;也可以使用request.files['file']
f = request.files.get('file')
# 判斷是否上傳成功
if f is None:
return jsonify({"Status": "Error 0000", "Msg": "沒有上傳圖片,請重新上傳!"})
# 檢查文件後綴名是否是圖片文件
if not allow_file(f.filename):
return jsonify({"Status": "Error 9999", "Msg": "文件格式不支持,僅支持如下圖片格式:'png', 'jpg', 'bmp'。"})
# 使用plt將圖片讀入爲數組
np_img = plt.imread(f)
# 對圖片進行處理
# Your code
return "Successful"
# 檢查文件後綴名是否是圖片文件
def allow_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
if __name__ == '__main__':
app.run()
3.2postman模擬請求
這裏用postman演示上述過程,具體步驟如下:
首先,使用POST方式並設置HTML 的Headers爲:
{"key":"Content-Type","value":"multipart/form-data"}
然後在Body中設定key爲file,value則爲文件;然後點擊Send即可
{"key":"file","value":{},"description":"","type":"file","enabled":true}
3.2得到返回結果