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