如何(安全)将Python对象发送到我的Flask API?

时间:2019-01-02 16:01:32

标签: python json scikit-learn pickle

我目前正在尝试构建一个Flask Web API,该API可以在POST请求中接收python对象。

我正在使用Python 3.7.1来创建请求,并使用Python 2.7来运行API。该API设置为在我的本地计算机上运行。我尝试发送给我的API的对象是RandomForestClassifier的{​​{1}}对象,但这可能是各种各样的对象类型。

到目前为止,我已经尝试sklearn.ensemble我的对象,但是该对象不能JSON序列化。我也曾尝试json.dumps()我的对象,但这在尝试在API端加载对象时导致错误。另外,由于API将接收来自匿名用户的请求,因此我担心会对可能是恶意对象的对象执行pickle.dumps()

这是有理由担心吗?如果是这样,在POST请求中发送任何python对象的最佳方法是什么?

执行POST请求的脚本:

pickle.loads()

Flask API:

import requests
import pickle

url = "http://localhost:5000/flask-api-function"

# the object I want to send is the 'model' object
data = pickle.dumps(model)

r = requests.post(url,data=data)

此设置实际上在尝试用pickle解码数据时导致错误:

@app.route('/flask-api-function', methods=['POST'])
def flask_api_function():

  model = pickle.loads(request.get_data())

有没有一种不错且安全的方法?

1 个答案:

答案 0 :(得分:1)

当您在python 3中腌制该对象时,请传递protocol关键字并将其设置为2。这将确保它可以在python 2上使用。

import requests
import pickle

url = "http://localhost:5000/flask-api-function"

# the object I want to send is the 'model' object
data = pickle.dumps(model,protocol=2)

r = requests.post(url,data=data)

通常我会尝试找到一种将对象序列化为JSON的方法,因为pickle具有重大的安全风险