Я пытаюсь написать веб-службу, которая выполняет некоторую обработку данных. Запросы содержат вектор данных как двоичный файл, а метаданные и параметры обработки - данные формы. Пример использования питона с запросами:Возврат двоичных и параметрических данных из веб-службы бутылок
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>
У меня есть полное отсутствие опыта работы с веб-службами, так что я даже не знаю, если я нахожусь на правильном пути вообще. Суть в том, что я хочу вернуть некоторые двоичные данные вместе с несколькими (предпочтительно названными) метриками данных. Можно ли это делать только с помощью бутылки? Есть ли наилучшая практика (в отношении веб-сервисов, python или обоих), которые я должен соблюдать, когда дело доходит до такого рода вещей?
Обратите внимание, что клиент не будет написан на python, это только мой тестовый пример.
Спасибо за любые рекомендации!