基於Flask實現檔案的上傳功能的多例項Web服務
阿新 • • 發佈:2018-12-31
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),退出當前程式。
總結
這裡的程式碼很簡單,但是基本可以在其之上進行擴充套件,滿足更為複雜的需求。