Как отобразить повторные изображения?

Я пытаюсь получить пути повторного изображения от своей базы данных для отображения их, но она в настоящее время не работает.

Вот то, что я использую:

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 странице. Какая-либо идея, как я мог достигнуть этого?

1
задан user216171 15 May 2010 в 22:08
поделиться

3 ответа

Дважды вы используете image.image_path , но в одном месте (где, вы говорите нам, вы получаете ошибку) вы используете изображение [id] .image_path вместо этого. Какой id , по вашему мнению, может быть подходящим индексом для изображения , и почему существует несоответствие в использовании в различных местах вашего кода?

Если вам нужно определенное количество изображений, почему бы не использовать синтаксис нарезки? Например. вы можете получить первые 10 изображений (обязательно включите order_by , чтобы получить предсказуемые, повторяемые результаты), вы можете разрезать результаты filter_by на [0:10] ; вторые 10 изображений, [10:20] ; и так далее.

1
ответ дан 3 September 2019 в 00:31
поделиться

Я думаю, что вы предполагали/надеялись, что результат запроса 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 изображений и получения данных для каждого из них из файловой системы и возврата чего-то вроде списка необработанных блоков данных изображения.

1
ответ дан 3 September 2019 в 00:31
поделиться

Предполагая, что 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
0
ответ дан 3 September 2019 в 00:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: