python使用flask封裝restful API

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攻擊,現已經訓練好一個決策樹模型。

  1. 本地新建一個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
  1. 打開命令窗扣
    執行python server.py
  2. 本地新建一個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})
  1. 打開命令窗扣
    執行python client.py這樣就完成了機器學習模型的線上部署
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章