Как отобразить несколько изображений? - PullRequest
1 голос
/ 16 мая 2010

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

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

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

Я хочу, чтобы Pylons отображал несколько файлов jpg на 1 странице. Есть идеи, как мне этого добиться?

Ответы [ 3 ]

1 голос
/ 16 мая 2010

Я предполагаю, что вы предполагали / надеялись, что результат запроса 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 голос
/ 16 мая 2010

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

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

0 голосов
/ 08 июля 2010

Предполагая, что «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
...