1. 程式人生 > >基於Flask實現檔案的上傳功能的多例項Web服務

基於Flask實現檔案的上傳功能的多例項Web服務

flask是Python中非常輕量的Web框架,允許開發者以非常少的程式碼實現各類的Web應用,本文將簡單例項一個簡單Web的檔案上傳功能的開發。

環境介紹

Centos 7.2, virtual env 下的python 3。

安裝flask

pip3 install flask
pip3 install flask_uploads

這裡安裝了flask相關的元件以及upload元件。

安裝相關圖片類庫

pip3 install Pillow

安裝部署gunicorn

由於Python中的GIL的存在,所以這裡使用了gunicorn基於多程序來解決問題,實現高效能的Web服務支援。
安裝gunicorn的服務

pip3 install gunicorn

啟動指令碼

nohup gunicorn -w 2 -b 0.0.0.0:9010 webapp.py:app &

nohup表示當前程序在terminal中斷之後,仍然在後臺執行。
-w 設定的子程序數量,2表示一共3個程序。
-b 當前web服務的地址以及埠,0.0.0.0表示當前的任意地址
webapp.py:app啟動webapp.py中的flask應用。
-e key=val 將key/val作為環境變數傳入os.environ之中,在Python程式碼中可以進行讀取。
& 表示後臺執行的。 只在terminal未中斷之前生效。

上傳的程式示例

from flask import Flask
from flask import send_file, send_from_directory
from flask_uploads import UploadSet, IMAGES, configure_uploads, patch_request_class
from flask import make_response, request
from werkzeug.utils import secure_filename

app = Flask(__name__)
tmp_image_path = "/home/xxxx/webapps/imagetmp"
logging.config.fileConfig("logging.conf") logger = logging.getLogger("filelogger") images = UploadSet('images', IMAGES) app.config['MAX_CONTENT_LENGTH'] = 10*1024 * 1024 app.config['UPLOADED_IMAGES_DEST'] = tmp_image_path configure_uploads(app, images) patch_request_class(app) @app.route("/V1/image/wing", methods=['POST']) def testBytes(): file = request.files['fileData'] param1= request.form["is_param1"] param2= request.form["param2"] logger.info("incoming useMatting:" + str(useMatting)) # 這裡變數都是數字型的,將被轉換為boolean param1 = False if param1 == "1": logger.info("set the flag:" + str(param1 )) param1 = True param2 = False if param2 == "1": param2 = True logger.info("is_mask:" + str(param2)) # # 業務邏輯操作等等 # ##imgByteArr是一個位元組陣列,返回了一個圖片的位元組陣列 return send_file(imgByteArr, mimetype='image/png') if __name__ == "__main__": app.run()

這裡雖然引入了secure_filename,這裡並未使用,大家可以自行參考進行安全的過濾。

Tips

可以判斷程式中的環境變數是否完全具備,如果不具備,則可以使用sys.exit(0),退出當前程式。

總結

這裡的程式碼很簡單,但是基本可以在其之上進行擴充套件,滿足更為複雜的需求。

Reference