Django:“collectstatic”也应该收集媒体文件吗?

Posted

技术标签:

【中文标题】Django:“collectstatic”也应该收集媒体文件吗?【英文标题】:Django: Is "collectstatic" supposed to collect media files as well? 【发布时间】:2015-10-29 21:04:27 【问题描述】:

我不知道我是否混淆了collectstatic 的用途。这是我的设置模块

# BASE_DIR is the location of my django project folder

STATIC_URL = '/this.static/'
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "ve_static_root")
STATICFILES_DIRS = (

    os.path.join(BASE_DIR, "this.static"),
    os.path.join(BASE_DIR, "this.media"),

                    )
MEDIA_URL = '/this.media/'
MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), "ve_media_root")

在这里,我将我的静态文件和媒体文件都放在STATICFILES_DIRS 中,这样当我在我的 Markdown 文档中调用/嵌入图像时,我可以使用媒体文件作为一个简单的参考,但正如你也可以看到的,我做了一个MEDIA_ROOT 的路径,需要与 STATIC_ROOT 不同。我担心的是我将媒体文件夹this.media 放在STATICFILES_DIRS 文件夹中,这样我就可以使用这些静态文件过滤器将图像或视频调用到Django 模板中,例如% static 'image/file/path/here' %。如此方便,我还想知道如果我所有的文件、图像/视频和网页设计文件都只是进入 STATIC_ROOT,MEDIA_ROOT 的意义何在?据我所知,Django 没有collectmedia 命令,所以我真的没有任何东西收集到 MEDIA_ROOT 文件夹中。我只是把它放在这里,空无一物。

我错过了什么吗?有人了解 Django 对此的看法吗?你的观点是什么?我不确定collectstatic 是否也应该涉及收集媒体文件,尤其是当我有 MEDIA_ROOT 时。我查看了有关静态文件的文档,它们对媒体文件确实没有太大帮助。

【问题讨论】:

【参考方案1】:

Django documentation 不鼓励将静态根和媒体根作为同一目录(将它们放在同一父目录中可能是可以的)。虽然没有具体在文档中详细说明,但原因在于用户生成的文件固有的不确定性。如果静态文件和媒体文件都是从类似的目录提供的,那么在适当的情况下,用户可能能够上传任何文件,随后可能会提供这些文件。这当然会造成重大的安全漏洞——这就是为这两类文件设置两个单独目录的动机。

collectstatic 依赖于STATICFILES_DIRS 数组来生成一个目录列表,collectstatic 应该通过这些目录搜索静态文件。如果您在STATICFILES_DIRS 中包含媒体文件,那么在运行collectstatic 时(由您或Fabric 等自动化服务发起),媒体和静态文件将存在于同一输出目录中。

该文档还有一个关于Serving files uploaded by a user during development 的部分,您可以像访问任何静态文件一样访问媒体文件所在的 url。你可以简单地追加

+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

到您的 URL 配置。

django.contrib.staticfiles.views.serve() 但是,不应用于部署。我已经写了更多关于这个here。强烈建议您在生产中从项目外部的目录中提供静态文件(并根据需要存储和提供媒体文件)。

【讨论】:

【参考方案2】:

媒体文件是用户上传到您的 Django 站点的文件。

静态文件是您希望作为网站一部分的文件(通常是 CSS、javascript 和图像)。

因此,我不希望 collectstatic 对媒体文件做任何事情。

【讨论】:

以上是关于Django:“collectstatic”也应该收集媒体文件吗?的主要内容,如果未能解决你的问题,请参考以下文章

Django - manage.py collectstatic 保存到错误的文件夹

详解django中的collectstatic命令以及STATIC_URLSTATIC_ROOT配置

Django学习——collectstatic错误

Django 的 collectstatic 有啥意义?

ValueError:即使在 collectstatic 之后也缺少静态文件清单条目

Django collectstatic 没有这样的文件或目录