【问题标题】:How to retrieve a pdf/image from reference field using MongoEngine?如何使用 MongoEngine 从参考字段中检索 pdf/图像?
【发布时间】:2020-06-23 11:53:50
【问题描述】:

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

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

【问题讨论】:

    标签: python mongodb mongoengine flask-restful flask-mongoengine


    【解决方案1】:

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

    【讨论】:

    • 非常感谢!我会试试这个,让你知道结果如何!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 2016-10-31
    • 2013-04-25
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    相关资源
    最近更新 更多