2010-05-15 9 views
1

J'essaie d'obtenir plusieurs chemins d'image de ma base de données afin de les afficher, mais cela ne fonctionne pas actuellement.Comment afficher plusieurs images?

Voici ce que j'utilise:

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 

Je reçois une erreur concernant cette partie:

image[id].image_path 

Ce que je veux est pour Pylônes à afficher plusieurs fichiers jpg sur une page. Une idée de comment je pourrais y arriver?

+0

Les os.path.exists() chèque arrive trop tard: si le fichier ne sort, open() soulèvera IOError.Utilisez try/except à la place. –

Répondre

1

Vous utilisez deux fois image.image_path, mais à un endroit (où, vous nous dites, vous obtenez une erreur), vous utilisez image[id].image_path à la place. Ce qui est id que vous croyez pourrait être un indice approprié dans image, et pourquoi la différence dans l'utilisation entre les différents points de votre code?

Si vous voulez un certain nombre d'images, pourquoi ne pas utiliser la syntaxe de trancher? Par exemple. vous pouvez obtenir les 10 premières images (assurez-vous d'inclure un order_by pour obtenir des résultats prévisibles et reproductibles), vous pouvez couper les résultats de l'filter_by par [0:10]; la deuxième 10 images, [10:20]; et ainsi de suite.

1

Je pense que ce que vous assumez/espoir est que le résultat de la requête filter_by contient un dictionnaire mappage des images récupérées à leur carte d'identité. Au lieu de cela, il contient un objet de requête qui représente une promesse de renvoyer un ensemble de résultats itératifs quand il est forcé par un accès à une expression de tranche comme Alex mentionné ou à une opération d'itération.

Ceci est probablement pas la meilleure façon de résoudre ce problème, mais je pense que la modification de votre code pour ressembler à ceci accomplira probablement ce que vous voulez:

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 

La façon plus sensible serait quelque chose comme ceci:

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 

Bien sûr, vous êtes en supposant qu'une image existe qui correspond à la requête et il ne peut pas, vous devriez donc probablement une erreur de manipulation pour que là où je quittai le commentaire TODO.

Bien sûr, aucun de ces changements ne renvoyer les données pour une seule image. Si vous voulez plusieurs images, vous devrez appeler cette fonction une fois pour chaque image, probablement dans le gestionnaire de requêtes pour une sorte d'affichage de l'image.

Si vous voulez vraiment renvoyer les données d'images brutes pour plusieurs images à la fois, puis la suggestion d'Alex à utiliser tranchage pour revenir par exemple 10 dossiers à la fois de la base de données est probablement la meilleure façon d'aller, mais alors vous devrez modifier le reste du code à itérer sur la liste des images N et récupérer les données pour chaque à partir du système de fichiers et retourner quelque chose comme une liste des blobs de données d'image brutes.

0

En supposant que « id » contient un nombre de 0 à images mais il y a beaucoup, vous avez besoin de le convertir à partir d'une chaîne en un int avant de pouvoir indexer un tableau. Je ferais quelque chose comme

 
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 
Questions connexes