Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Flask将机器学习模型部署为RESTAPI。错误:RuntimeError:在请求上下文之外工作_Python_Rest_Api_Machine Learning_Flask - Fatal编程技术网

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

Python 使用Flask将机器学习模型部署为RESTAPI。错误:RuntimeError:在请求上下文之外工作,python,rest,api,machine-learning,flask,Python,Rest,Api,Machine Learning,Flask,我开发了一个用于测试分类的分类器。并尝试使用RESTAPI访问它。代码如下: 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) pr

我开发了一个用于测试分类的分类器。并尝试使用RESTAPI访问它。代码如下:

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.
运行时错误回溯(最近的调用
最后)
在()
3网址:http://localhost:9000/spend_api'
4个文件={'file':('Test_data_final.csv')}
---->5R=request.post(url,files=files)
6.
7.
C:\Users\pavansubhash\u t\AppData\Local\Continuum\Anaconda2\lib\site-
packages\werkzeug\local.pyc中的\uuuuu getattr\uuuuuu(self,name)
345如果名称='\uuuuu成员\uuuuuu':
346返回目录(self.\u get\u current\u object())
-->347 return getattr(self.\u get\u current\u object(),name)
348
349定义设置项(自身、键、值):
C:\Users\pavansubhash\u t\AppData\Local\Continuum\Anaconda2\lib\site packages\werkzeug\Local.pyc在\u get\u current\u对象(self)中
304         """
305如果不是HASTATR(自本地),“本地释放”:
-->306返回自我。uuu本地()
307尝试:
308返回getattr(self.\u本地,self.\u名称)
C:\Users\pavansubhash\u t\AppData\Local\Continuum\Anaconda2\lib\site packages\flask\globals.pyc in\u lookup\u req\u对象(名称)
35 top=\u请求\u ctx\u堆栈.top
36如果顶部为无:
--->37 raise RUNTIMERROR(\u请求\u ctx\u错误\u消息)
38返回getattr(顶部,名称)
39
运行时错误:在请求上下文之外工作。
这通常意味着您试图使用所需的功能 活动的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)
您可以在此线程中找到更多详细信息

修复如何发送json响应 如果您想改为发送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的设计。

请发布完整的错误输出。同时尝试将代码缩减为a。@Christoph按照建议编辑了代码。请建议如何解决此问题issue@pavansubhash请分享一个极小的可复制的例子。我想你粘贴到上面时丢失了标识。如果没有,请开始修复该问题,post请求处理程序函数make_predict的定义不清楚。@MedAli现在可以了吗?我对不正确的标识表示歉意如果您可以在每个步骤后添加print,这可能有助于理解问题。否则,此行中会出现问题:
return jsonify(results=final_pred_file.to_csv(sub_file))
。您不能jsonfiy一个csv文件。to_csv操作将不发送任何文件,它的作用是在您执行代码的磁盘中写入一个文件。如果您想发送JSON,您应该使用final_pred_file.to_dict(orient=“records”)正如我在前面的评论中提到的,现在我得到一个ConnectionError:ConnectionError:('Connection aborted',error(10054,'现有连接被远程主机强制关闭'))@pavansubhash您的示例不会重现错误。除非您分享我可以在我的机器上运行的最小示例以及您的错误,否则我帮不了您多少。在回答中,我试图提供足够的信息来帮助解决可见的问题。现在,由您决定。
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)