python - 使用 Flask 将机器学习模型部署为 REST API。错误 : RuntimeError: Working outside of request context

标签 python rest api machine-learning flask

我开发了一个用于测试分类的分类器。并尝试使用 REST 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)

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

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

我遇到运行时错误。你能帮忙解决这个问题吗?

这里是错误:

  RuntimeError                              Traceback (most recent call 
  last)
  <ipython-input-15-4b8522aa1eb0> in <module>()
         3 url = 'http://localhost:9000/spend_api'
         4 files = {'file': ('Test_data_final.csv')}
   ----> 5 r = request.post(url,files=files)
         6 
         7 

      C:\Users\pavansubhash_t\AppData\Local\Continuum\Anaconda2\lib\site -
    packages\werkzeug\local.pyc in __getattr__(self, name)
         345         if name == '__members__':
    346             return dir(self._get_current_object())
--> 347         return getattr(self._get_current_object(), name)
    348 
    349     def __setitem__(self, key, value):

C:\Users\pavansubhash_t\AppData\Local\Continuum\Anaconda2\lib\site-packages\werkzeug\local.pyc in _get_current_object(self)
    304         """
    305         if not hasattr(self.__local, '__release_local__'):
--> 306             return self.__local()
    307         try:
    308             return getattr(self.__local, self.__name__)

C:\Users\pavansubhash_t\AppData\Local\Continuum\Anaconda2\lib\site-packages\flask\globals.pyc in _lookup_req_object(name)
     35     top = _request_ctx_stack.top
     36     if top is None:
---> 37         raise RuntimeError(_request_ctx_err_msg)
     38     return getattr(top, name)
     39 

RuntimeError: Working outside of request context.

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

最佳答案

如果我很好地理解您的要求,您有一个预训练的分类器,并且您希望通过 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。

关于python - 使用 Flask 将机器学习模型部署为 REST API。错误 : RuntimeError: Working outside of request context,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45252447/

相关文章:

python - Airflow 使用 PythonOperator 的模板文件

rest - 使用Restful API curl

python - 序列化具有一对一关系的对象 Django

rest - 使用 @WebMvcTest 进行测试时出现 ApplicationContext 异常

使用 Java 从 OMDB (IMDB) API 进行 Java JSON 解码

用于代码评论的 Github API

jquery - 缓存自动完成 JSON 响应

Python numpy 排列

python - 尝试执行使用 MySQL 的 Python 程序时出错

python - FileNotFoundError ("No such file: ' %s'"% fn) FileNotFoundError : No such file: (Mask_RCNN)