Я предполагаю, что вы предполагали / надеялись, что результат запроса filter_by содержит словарь, отображающий изображения, полученные по их идентификаторам. Вместо этого он содержит объект запроса, который представляет собой обещание вернуть итеративный набор результатов, когда он вынужден получить доступ либо к выражению слайса, как упомянул Алекс, либо к операции итерации.
Вероятно, это не лучший способ решить эту проблему, но я думаю, что изменение вашего кода таким образом, вероятно, достигнет того, что вы хотите:
def get_image(self, userid, id):
image = meta.Session.query(Image).filter_by(userid=userid)
image = dict((img.id, img) for img in image)
permanent_file = open(image[id].image_path, 'rb')
if not os.path.exists(image.image_path):
return 'No such file'
data = permanent_file.read()
permanent_file.close()
response.content_type = guess_type(image.image_path)[0] or 'text/plain'
return data
Более разумный путь будет примерно таким:
def get_image(self, userid, id):
image = meta.Session.query(Image).filter_by(userid=userid).filter_by(id=id).first()
# TODO: Handle the case when image is None
permanent_file = open(image[id].image_path, 'rb')
if not os.path.exists(image.image_path):
return 'No such file'
data = permanent_file.read()
permanent_file.close()
response.content_type = guess_type(image.image_path)[0] or 'text/plain'
return data
Конечно, вы предполагаете, что существует изображение, которое соответствует запросу, а может и нет, поэтому вам, вероятно, следует обработать ошибку для того места, где я оставил комментарий TODO.
Конечно, любое из этих изменений вернет данные только для одного изображения. Если вам нужно несколько изображений, вам придется вызывать эту функцию один раз для каждого изображения, возможно, в обработчике запросов для какого-либо вида изображения.
Если вы действительно хотите вернуть необработанные данные изображения для нескольких изображений одновременно, то Алексу предлагается использовать нарезку для возврата, например. 10 записей одновременно из базы данных - это, вероятно, лучший путь, но тогда вам придется изменить оставшуюся часть кода, чтобы перебрать список из N изображений, извлечь данные для каждой из файловой системы и вернуть что-то как список необработанных больших двоичных данных.