1. 簡介
使用flask封裝,簡單來講就是將python文件引入flask。這樣的結果就是在網頁上輸入一個url就能得到結果。下面就講如何進行實現。
2. 任務1:求兩數之和
2.1 代碼講解
新建一個server.py的文件,文件中代碼如下所示:
from flask import Flask
from flask import request
from flask import jsonify
def get_sum(x, y):
result = x + y
return result
app = Flask(__name__)
@app.route('/',methods=['POST','GET','PUT'])
def get_result():
x = request.args.get('first')
y = request.args.get('second')
res = get_sum(x, y)
return str(res)
if __name__ == '__main__':
app.config['JSON_AS_ASCII'] = False
app.run()
最上面導包和python一樣,不再贅述。
導包和app = Flask(__name__)
之間的內容(本例中就是get_sum函數)爲執行python server.py加入內存的東西。假如我們現在不僅需要計算一次兩數之和,而是給了100組數,每組數都要計算兩數之和,那麼我們需要不斷加載get_sum函數,然後求和(如果換成一個機器學習的例子可能更好理解。比如我們已經訓練好一個模型,現在要實時預測,即來一條數據加載一次模型,然後預測。再來一條數據,重複上述過程。每次來數據,我們都加載模型,會很浪費時間,尤其是模型很大時,這時把load模型的代碼放到get_sum的位置,在命令窗口執行python server.py後,模型就永久加載到內存了,不需要每次來一條數據都要加載一次模型,第3章的例子可能會幫助理解, 可詳看第三章)
app = Flask(__name__)
個人覺得寫法比較固定,可不用理會
@app.route('/',methods=['POST','GET','PUT'])
斜槓/貌似也比較固定,可先不用管,有的例子也做了調整,可見鏈接:http://www.pythondoc.com/flask-restful/first.html。methods是http請求的方法,目前有8種請求方法:
具體詳見博客:https://www.cnblogs.com/weibanggang/p/9454581.html。在實際應用中發現,如果想要新建一個excel文件,並保存代碼的結果,必須加put纔有結果,否則得到的excel文件是空的。具體原理涉及http請求,本人不太懂。
接下來get_result函數具體作用大致有兩個:一個是從url中獲得相應的參數值。本例中要求兩數之和,因此必須得到兩個數x和y的值,那麼 x = request.args.get(‘first’)
y = request.args.get(‘second’)就是從url解析出first和second參數,並把兩個參數的值分別賦給x和y,不過賦值前需要先轉化成int,因爲從url中解析到的參數值是str類型,url長什麼樣子下面會講。第二個作用就是從內存中(就是本例上面所講的get_sum函數)調用相應函數以獲得最終結果。特別需要註明的是get_result函數必須有return,不能省略或者寫成return None,否則在網頁使用url打開時會報錯,且返回的類型不能是int,只能是str或者json。
if __name__ == '__main__':
和python中用法一樣
app.config['JSON_AS_ASCII'] = False
固定用法暫時不管
app.run()
這個就是運行整個程序,run有兩個參數,可寫成app.run(host="192.168.199.166", port=5000)
。我們知道在瀏覽器中輸入ip地址或者域名都可以打開網頁,那麼host就指定了打開哪個網頁,port指定了端口。不寫的話默認是本地地址,發現無論是自己的window電腦還是linux電腦,默認ip都是127.0.0.1,端口都是5000。
2.2 執行講解
上面我們在server.py文件中寫好代碼後,就可以打開命令窗口執行python server.py了,如下圖所示:
此時get_sum函數已經加載到內存。
然後打開自己的瀏覽器,輸入http://127.0.0.1:5000/?first=3&second=4
- http://127.0.0.1:5000就是我們app.run中指定的host和port
- /?:固定寫法,記住吧,應該是http的知識
- first=3:即
x = request.args.get('first')
中的first,因此x現在是3,注意這時3是str類型(即使沒有引號,默認都是str類型),要計算和需要轉換成int - second=4:同上
- &:多個參數之間用&符號連接
最終頁面返回結果如下:
3. 任務2:機器學習任務用於線上部署
任務:預測url中是否含有xss攻擊,現已經訓練好一個決策樹模型。
- 本地新建一個server.py文件
import numpy as np
from flask import Flask
from flask import request
from flask import jsonify
import joblib
import re
import urllib
import base64
import string
dt_model = joblib.load('DT-module.m') # 決策樹模型
std_model = joblib.load('DT-std-module.m') # 數據標準化模型
# 提取url的特徵
def get_feature(url):
# url的長度
處於保密性,省略該函數的代碼,此函數的目的就是根據url提取特徵數據
app = Flask(__name__)
@app.route('/',methods=['POST','GET'])
def output_data():
text=request.args.get('inputdata') # inputdata爲需要檢測的url
if text:
url_feature = get_feature(url)
url_feature = np.array(url_feature).reshape(1, -1)
std_feature = std_model.transform(url_feature)
pred = dt_model.predict(std_feature)
return jsonify(str(pred)) # 轉化成json方式
if __name__ == '__main__':
app.config['JSON_AS_ASCII'] = False
app.run(host='127.0.0.1',port=6666) # 127.0.0.1 #指的是本地ip
- 打開命令窗扣
執行python server.py
- 本地新建一個client.py文件
import requests
import time
from sklearn.metrics import accuracy_score
import pandas as pd
time_list = [] # 記錄時間
pred = [] # 用於記錄一個個url的結果
with open('test.csv', 'rb') as f: # test.csv中有用於檢測的url
for line in f:
time_start = time.time()
base = 'http://127.0.0.1:6666/?inputdata=%s'%line # url
response = requests.get(base) # 類似於第2章從網頁打開了url
answer = response.json() # 獲得網頁返回的結果
print('預測結果',answer)
time_end = time.time()
one_time = time_end - time_start
time_list.append(one_time)
answer = answer[1] # 返回的結果是一個str,str裏面是list,list裏只有一個元素0或者1,代表是否是xss攻擊。爲了取出0或者1,需要本代碼
pred.append(int(answer))
mean_time = sum(time_list) / len(time_list)
result = pd.DataFrame({'real_label':label, 'pred':pred})
- 打開命令窗扣
執行python client.py
這樣就完成了機器學習模型的線上部署