如何显示多个图像?

时间:2010-05-15 22:02:58

标签: python sqlalchemy pylons

我正在尝试从我的数据库中获取多个图像路径以显示它们,但它目前无效。

以下是我正在使用的内容:

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在1页上显示几个jpg文件。知道如何实现这个目标吗?

3 个答案:

答案 0 :(得分:1)

你使用image.image_path两次,但在一个地方(你告诉我们,你得到一个错误),你使用image[id].image_path代替。您认为id可能是image的正确索引,以及为什么代码中不同位置的使用差异?

如果您想要一定数量的图像,为什么不使用切片语法?例如。你可以获得前10张图片(确保包含order_by以获得可预测的,可重复的结果),您可以将filter_by的结果切分为[0:10];第二个10张图片,[10:20];等等。

答案 1 :(得分:1)

我的猜测是你假设/希望的是filter_by查询的结果包含一个字典,将检索到的图像映射到它们的id。相反,它拥有一个查询对象,该对象表示当通过访问像Alex提到的切片表达式或迭代操作强制访问时,返回可迭代结果集的承诺。

这可能不是解决此问题的最佳方法,但我的猜测是将代码修改为这样可能会达到您想要的效果:

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评论的那个部分进行一些错误处理。

当然,任何这些更改都只会返回单个图像的数据。如果你想要多个图像,你将不得不为每个图像调用一次这个函数,可能是在某种图像视图的请求处理程序中。

如果你确实想要一次返回多张图像的原始图像数据,那么Alex建议使用切片来取回,例如一次从数据库中记录10条记录可能是最好的方法,但是你必须修改剩下的代码来迭代N个图像列表并从文件系统中检索每个数据并返回一些东西就像原始图像数据blob列表一样。

答案 2 :(得分:0)

假设“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