我正在尝试编写一个执行某些数据处理的Web服务。请求包含作为二进制文件的数据向量,以及作为表单数据的元数据和处理参数。使用python和请求的示例:
import numpy as np
import requests
url = 'http://localhost:8080/pp'
payload = {'param_a': 4, 'param_b': -2.1}
file = {'binary_data': ('file_name.bin', bytes(np.random.randn(1000))}
r = requests.post(url, data=payload, files=file)
现在在服务方面,我有:
import bottle
import numpy as np
@bottle.post('/pp')
def pp():
file_path = '/home/generic_user/howhaveyou.bin'
return_file_path = '/home/generic_user/finethanks.bin'
bin_file = bottle.request.files.get('binary_data')
bin_file.save(file_path, overwrite=True)
param_a = float(bottle.request.forms.get('param_a')
param_b = float(bottle.request.forms.get('param_b')
data_vector = np.fromfile(file_path)
processed_data_vector = (data_vector-param_a)*param_b
processed_data_mean = np.mean(processed_data_vector)
processed_data_samples = len(processed_data_vector)
return_metrics = {'mean': processed_data_mean,
'n_of_samples': processed_data_samples}
with open(return_file_path, 'wb') as return_file:
return_file.write(bytes(processed_data_vector))
return return_metrics, bottle.static_file(return_file_path, '/')
哪个不太合适。任何一个返回都是自己工作的,但是我得到了以下响应:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
<title>Error: 500 Internal Server Error</title>
<style type="text/css">
html {background-color: #eee; font-family: sans;}
body {background-color: #fff; border: 1px solid #ddd;
padding: 15px; margin: 15px;}
pre {background-color: #eee; border: 1px solid #ddd; padding: 5px;}
</style>
</head>
<body>
<h1>Error: 500 Internal Server Error</h1>
<p>Sorry, the requested URL <tt>'http://localhost:8080/pp'</tt>
caused an error:</p>
<pre>Unsupported response type: <class 'dict'></pre>
</body>
</html>
我完全缺乏Web服务的经验,所以我甚至不知道我是否在正确的轨道上。关键是我希望返回一些二进制数据,以及所述数据的一些(最好是命名的)度量。是否可以仅使用瓶子进行此操作?在这类事情上我是否应该遵循最佳实践(关于Web服务,python或两者)?
请注意,客户端不会用python编写,这只是我的测试用例。
感谢任何指导!
答案 0 :(得分:0)
服务器端代码的问题在于您无法返回字典(return_metrics
)和具有相同响应的文件(return_file_path
)的内容。解决方案是将文件内容编码为字符串并将其包含在返回的字典(return_metrics
)中。然后,客户端将需要解码内容字符串以访问数据。