从瓶子Web服务返回二进制和参数数据

时间:2014-11-27 13:43:44

标签: python web-services binary-data bottle

我正在尝试编写一个执行某些数据处理的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>&#039;http://localhost:8080/pp&#039;</tt>
           caused an error:</p>
        <pre>Unsupported response type: &lt;class &#039;dict&#039;&gt;</pre>
    </body>
</html>

我完全缺乏Web服务的经验,所以我甚至不知道我是否在正确的轨道上。关键是我希望返回一些二进制数据,以及所述数据的一些(最好是命名的)度量。是否可以仅使用瓶子进行此操作?在这类事情上我是否应该遵循最佳实践(关于Web服务,python或两者)?

请注意,客户端不会用python编写,这只是我的测试用例。

感谢任何指导!

1 个答案:

答案 0 :(得分:0)

服务器端代码的问题在于您无法返回字典(return_metrics)和具有相同响应的文件(return_file_path)的内容。解决方案是将文件内容编码为字符串并将其包含在返回的字典(return_metrics)中。然后,客户端将需要解码内容字符串以访问数据。