首页 > 解决方案 > 如何使用 MongoEngine 从参考字段中检索 pdf/图像?

问题描述

我发现使用 mongodb 中的烧瓶检索一个类引用的 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'}

用户表中记录的 JSON 如下所示:

{
    "_id": "1", 
    "name": "John Doe", 
    "picture": {
        "$ref": "fs.files", 
        "$id": {
            "$oid": "5e1...a932"
         }
     }, 
     "email":"john.doe@example.come", 
     "password": "12345"
}

在 Flask Restful api 中使用这个模型,我试图检索与用户关联的图像以显示在我的应用程序中。此外,当添加新用户时,如何将文件与 User 表中的引用一起保存?图像的参考存储在图片字段中。我也想以同样的方式对 pdf 执行此操作。

我试过查看 GridFS,但我不太了解它是如何工作的,或者如何使用 mongoengine 在我的烧瓶 api 中实现它。谢谢。

标签: pythonmongodbmongoengineflask-restfulflask-mongoengine

解决方案


您可以使用send_fileFlask 的扩展来创建一个加载静态文件作为响应的 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


推荐阅读