使用Flask将机器学习模型部署为REST API。错误:RuntimeError:在请求上下文之外工作

时间:2017-07-22 08:35:03

标签: python rest api machine-learning flask

我开发了一种用于测试分类的分类器。并尝试使用REST API访问它。这是代码:

iex(1)> suffix = "_foo"
"_foo"
iex(2)> fields = [:"title#{suffix}", :"body#{suffix}"]
[:title_foo, :body_foo]

我正在尝试使用以下代码将CSV文件发送到api:

clf_model = joblib.load('MNB_Clf.pkl','r')

app = Flask(__name__)

@app.route('/spend_api',methods=['POST'])
def make_predict():
    data = request.get_json(force=True)

    test_data = pd.read_csv(data)

    pred_proba_class = clf_model.predict_proba(test_data['ColumnName1'])


    final_pred_file = pd.DataFrame(pred_proba_class)

    sub_file = 'output_'+str(datetime.datetime.now().strftime("%Y-%m-%d-%H-%M")) + '.csv'
    return jsonify(results=final_pred_file.to_csv(sub_file))
if __name__ == '__main__':
  app.run(port = 9000,debug=True)

我收到运行时错误。你能帮忙解决一下这个问题。

这是错误:

url = 'http://localhost:9000/spend_api'
files = {'file': ('Test_data_final.csv')}
r = request.post(url,files=files)

这通常意味着您尝试使用所需的功能 一个活动的HTTP请求。请参阅有关测试的文档 有关如何避免此问题的信息。

1 个答案:

答案 0 :(得分:1)

如果我很了解您的要求,您就拥有了预先训练好的分类器,并希望通过API进行分类。您的API接收CSV文件作为输入,并发回另一个CSV文件。要重构代码以执行此操作,您需要添加以下更改。

修复您在请求中发送文件的方式:

修复将csv文件加载到文件字典中的方式,如下所示:

url = 'http://localhost:9000/spend_api'
files = {'file': open('Test_data_final.csv','rb')}
r = request.post(url,files=files)

您可以在此SO主题中找到更多详细信息。

修复如何发送json响应

clf_model = joblib.load('MNB_Clf.pkl','r')

app = Flask(__name__)

@app.route('/spend_api',methods=['POST'])
def make_predict():
    data = request.get_json(force=True)

    test_data = pd.read_csv(data)
    pred_proba_class = clf_model.predict_proba(test_data['ColumnName1'])
    final_pred_file = pd.DataFrame(pred_proba_class)
    return jsonify(results=final_pred_file.to_dict(orient="records"))
if __name__ == '__main__':
  app.run(port = 9000,debug=True)

如果您要发送CSV文件

这是一个独立的工作示例:

from flask import Flask 
from flask import send_file 
from StringIO import StringIO 
import pandas as pd 

app = Flask("csv")

@app.route("/get_csv")
def hello():

    st = """col1|col2
    1|2
    3|4 
    """
    df = pd.read_csv(StringIO(st), sep="|")
    df.to_csv("/tmp/my_test_csv.csv", index=False, sep="|")
    return send_file("/tmp/my_test_csv.csv")


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

作为旁注,我建议您重新考虑使用JSON代替您的设计。