Я пытаюсь получить пути повторного изображения от своей базы данных для отображения их, но она в настоящее время не работает.
Вот то, что я использую:
def get_image(self, userid, id): image = meta.Session.query(Image).filter_by(userid=userid) 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
Я получаю ошибку относительно этой части:
image[id].image_path
То, что я хочу, - чтобы Опоры отобразили несколько jpg файлов на 1 странице. Какая-либо идея, как я мог достигнуть этого?
Дважды вы используете image.image_path
, но в одном месте (где, вы говорите нам, вы получаете ошибку) вы используете изображение [id] .image_path
вместо этого. Какой id
, по вашему мнению, может быть подходящим индексом для изображения
, и почему существует несоответствие в использовании в различных местах вашего кода?
Если вам нужно определенное количество изображений, почему бы не использовать синтаксис нарезки? Например. вы можете получить первые 10 изображений (обязательно включите order_by
, чтобы получить предсказуемые, повторяемые результаты), вы можете разрезать результаты filter_by
на [0:10]
; вторые 10 изображений, [10:20]
; и так далее.
Я думаю, что вы предполагали/надеялись, что результат запроса 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 изображений и получения данных для каждого из них из файловой системы и возврата чего-то вроде списка необработанных блоков данных изображения.
Предполагая, что id содержит число от 0 до любого количества изображений, вам нужно преобразовать его из строки в int, прежде чем вы сможете индексировать массив. Я бы сделал что-нибудь вроде
def get_image(self, userid, id): images = meta.Session.query(Image).filter_by(userid=userid) try: image = images[int(id)] with open(image.image_path, 'rb') as f: data = f.read() except (IndexError, ValueError, IOError): abort(404) response.content_type = guess_type(image.image_path)[0] or 'application/octet-stream' return data