python - 如何使用 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 中实现它。谢谢。
解决方案
您可以使用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()
希望它很适合你
推荐阅读
- javascript - 在 Ruby on Rails 应用程序中使用 JSON 将 Googlesheets 中的数据解析为 FusionCharts 时未定义的局部变量或方法“parsedData”
- ios - 如何在不中断其他功能的情况下使用动画滚动 UIScrollView?
- java - 如何从我的 Java 运行 python 2.7 代码?
- java - 从子类更改java中的私有方法
- php - 在 Heroku 上编辑 Laravel 框架文件
- xpath - 需要 XPath 和 XQuery 查询
- c# - Entity Framework Core 2.0 映射 int 到 SQL Server smallint 在查询时抛出异常
- mongodb - MongoDB 聚合函数:$sort 不能与 $sample 一起使用?
- javascript - 如何通过静态或原型方法将计算值传递给 ES6 类中的构造函数?
- javascript - 定义未定义 jquery - ext-language_tools.js