如何在 Django 中从 MongoDB 提供图像文件

Posted

技术标签:

【中文标题】如何在 Django 中从 MongoDB 提供图像文件【英文标题】:How to serve image files from MongoDB in Django 【发布时间】:2021-09-30 20:12:27 【问题描述】:

我正在构建一个将图像文件存储在 mongodb GridFS 中的 Django 应用程序。

我使用 Djongo 处理数据库,并按照此示例 https://www.djongomapper.com/using-django-with-mongodb-gridfs/ 将图像存储到数据库。

现在我可以通过管理页面将图像上传到数据库,需要使用这样的 URL 访问:

http://127.0.0.1:8000/files/60fae4884db41b9ad761c8b0

现在我在urls.py 中有这个

urlpatterns = [
    ...
    path('files/<str:fileid>', views.files, name='files'),
]

但在查看文件中我不知道如何从数据库中检索图像:

@login_required
def files(request, fileid):

    return response

我搜索了 Djongo 和 Django 的文档,但找不到简单的方法。

注意:在主数据库集合中,仅存储图像文件名。 在 gridfs 集合“文件”中存储了一个 ID(URL 中的那个)、图像名称(到主集合的唯一链接)和其他详细信息。 在“块”集合中,有一个 ID、一个 files_ID(文件 ID 的外键)和二进制数据。

【问题讨论】:

【参考方案1】:

您不应该使用 Django 提供文件,您需要设置 MEDIA_URL 并使其指向您的 Web 服务器,例如nginx 和使用 nginx-gridfs 提供文件的模块。

这适用于所有类型的存储,提供静态文件不应该通过 Django 来完成,它是 Web 服务器的工作。

Reference 检查“存储”部分下的警告

【讨论】:

两个问题: 1- 我可以用 apache 做到这一点吗?因为它是我的网络服务器。 2- 当以这种方式访问​​文件时,我可以强制执行我在应用程序中使用的相同身份验证吗? 1- 不确定 Apache。 2-您可以使用 Nginx 模块 nginx.org/en/docs/http/ngx_http_secure_link_module.html 这将使请求转到 Django,后者将通过安全链接将其转发到 Nginx,该链接将在几秒钟后过期

以上是关于如何在 Django 中从 MongoDB 提供图像文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中从 mongodb 更改 geojson (GeoJsonPolygon) 的编组?

如何在 Spring Boot 中从 Mongodb 读取集合数据并定期发布到 kafka 主题中

如何在 Spring Boot 中从 MongoDb 中仅读取特定的 JSON 节点

MongoDB:在一个查询中从不同的集合中获取文档

如何在MongoDB中从某些类别中查找特定文档

如何在 django 中从一对多关系中检索数据?