我目前正在尝试构建一个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())
有没有一种不错且安全的方法?
答案 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具有重大的安全风险