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配置