2014-11-27 1 views
0

Я пытаюсь написать веб-службу, которая выполняет некоторую обработку данных. Запросы содержат вектор данных как двоичный файл, а метаданные и параметры обработки - данные формы. Пример использования питона с запросами:Возврат двоичных и параметрических данных из веб-службы бутылок

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> 

У меня есть полное отсутствие опыта работы с веб-службами, так что я даже не знаю, если я нахожусь на правильном пути вообще. Суть в том, что я хочу вернуть некоторые двоичные данные вместе с несколькими (предпочтительно названными) метриками данных. Можно ли это делать только с помощью бутылки? Есть ли наилучшая практика (в отношении веб-сервисов, python или обоих), которые я должен соблюдать, когда дело доходит до такого рода вещей?

Обратите внимание, что клиент не будет написан на python, это только мой тестовый пример.

Спасибо за любые рекомендации!

ответ

0

Проблема с серверным кодом заключается в том, что вы не можете вернуть словарь (return_metrics) и содержимое файла (return_file_path) с тем же ответом. Решением является кодирование содержимого файла в строке и включение его в возвращаемый dict (return_metrics). Затем клиенту необходимо будет декодировать строку содержимого для доступа к данным.