我发现从mongodb中检索一个类使用flask引用的pdf/image文件有些困难。例如,我有一个模型:
class Users(db.Document):
_id = db.StringField()
name = db.StringField()
picture = db.ReferenceField('fs.files')
email = db.StringField()
password = db.StringField()
meta = {'collection': 'Users'}
Users表中记录的JSON如下所示:
{
"_id": "1",
"name": "John Doe",
"picture": {
"$ref": "fs.files",
"$id": {
"$oid": "5e1...a932"
}
},
"email":"john.doe@example.come",
"password": "12345"
}
在Flask Restful api中使用这个模型,我试图检索与用户相关联的图像,以显示在我的应用程序中。此外,当添加新用户时,如何保存具有"用户"表中引用的文件?图像的参考存储在图片字段中。我也想以同样的方式为pdf做这件事。
我试过看GridFS,但我不太了解它是如何工作的,也不太了解如何在我的flask api中用mongoengine实现它。谢谢
您可以使用Flask的send_file
扩展名来创建一个url,该url将静态文件作为响应加载。
from flask import send_file
@app.route('/get-image/<user>')
def get-image(user):
"""Serves static image loaded from db."""
user = Users.objects(name=user).first()
return send_file(io.BytesIO(user.picture.read()),
attachment_filename='image.jpg',
mimetype='image/jpg')
为了使上述解决方案发挥作用,您应该在文档模型上使用FileField()
而不是ReferenceField()
PS:我不确定你是否可以使用ReferenceField来归档,下面的方法使用gridfs,这似乎是合适的方式。
class Users(db.Document):
_id = db.StringField()
name = db.StringField()
picture = db.FileField()
email = db.StringField()
password = db.StringField()
meta = {'collection': 'Users'}
您可以将文件加载到模型中,如下所示:
user = Users.objects(name='User123').first()
with open('pic.jpg', 'rb') as fd:
user.picture.put(fd, content_type = 'image/jpeg')
user.save()
希望它很适合你
http://docs.mongoengine.org/guide/gridfs.html