Python-Flask:将数据传递给机器学习python脚本并返回结果

时间:2015-07-29 15:11:16

标签: python flask

我对Web框架的了解非常糟糕。我在python中构建了一个机器学习模型,它将一组字符串作为输入并返回结果。在网上搜索后,我遇到了Flask。但我不知道的是如何实际创建一个烧瓶应用程序来实际获取字符串并允许用户提交并将该字符串传递给我的机器学习python脚本并返回结果。这就是我到目前为止所做的一切

import threading
import subprocess
import os
import sys
from flask import Flask
from flask import render_template, abort
app = Flask(__name__)
app.debug = True

def run_script():
    theproc = subprocess.Popen([sys.executable, "ML_script.py"])
    theproc.communicate()


if __name__ == "__main__":
    app.run()

如果您可以指出一个示例或提供一个非常棒的解决方案/骨架。

1 个答案:

答案 0 :(得分:5)

您可以使用机器学习功能,就像任何其他Python功能一样,不需要subprocess。设置您的应用:

from flask import Flask
from flask import render_template, abort, jsonify, request,redirect, json
from my_app.machine_learning import analyzer
app = Flask(__name__)
app.debug = True

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/learning', methods=['POST'])
def learning():
    data = json.loads(request.data)
    # data == {"userInput": "whatever text you entered"}
    response = analyzer(data)
    return jsonify(response)


if __name__ == '__main__':
    app.run()

我在机器学习模块中使用了一个名称,但analyzer()应该是该模块中的一个函数,它调用进行计算所需的所有其他函数,并返回一个包含结果的字典。所以像这样:

def analyzer(data):
    vocab = build_vocab(training_data)
    cl = train_classifier(vocab, trianing_data)
    results = cl.predict(data)
    results = format_results_to_dict()
    return results

模板很简单:

<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="../static/script.js"></script>
</script>
</head>

<body>
    <h1>Calculation</h1>
    <h1>Test Page</h1>
    <input id="user-input" placeholder="Text to be analyzed"></input>
    <p id="results">Results will go here<p>
    <button id="submit">Submit</button>
</body>
</html>

和JS脚本将它们捆绑在一起:

$(document).ready(function(){
    $("#submit").click(function(event){
        var uInput = $("#user-input").val();
        $.ajax({
              type: "POST",
              url: '/learning',
              data: JSON.stringify({userInput: uInput}),
              contentType: 'application/json',
              success: function(response){
                   $("#results").text(response.results);
                },
          });
    });
});