Как получить pdf/изображение из справочного поля с помощью MongoEngine?

Я обнаружил некоторые трудности с получением файла pdf/image, на который ссылается класс, используя flask из mongodb. Например, у меня есть эта модель:

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 для записи в таблице Users будет выглядеть так:

{
    "_id": "1", 
    "name": "John Doe", 
    "picture": {
        "$ref": "fs.files", 
        "$id": {
            "$oid": "5e1...a932"
         }
     }, 
     "email":"[email protected]", 
     "password": "12345"
}

Используя эту модель в Flask Restful API, я пытаюсь получить изображение, связанное с пользователем, для отображения в моем приложении. Кроме того, когда добавляется новый пользователь, как мне сохранить файл со ссылкой в ​​таблице пользователей? Ссылка на изображение хранится в поле изображения. Я также хочу сделать это для PDF-файлов таким же образом.

Я пытался смотреть на GridFS, но я не совсем понимаю, как это работает или как реализовать его в моем API-интерфейсе фляги с помощью mongoengine. Спасибо.


person blazedtrailz    schedule 11.03.2020    source источник


Ответы (1)


Вы можете использовать расширение send_file из Flask для создания 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

person Kenny Aires    schedule 11.03.2020
comment
Спасибо большое! Я попробую это и дам вам знать, как это происходит! - person blazedtrailz; 11.03.2020