【问题标题】:Differences between STATICFILES_DIR, STATIC_ROOT and MEDIA_ROOTSTATICFILES_DIR、STATIC_ROOT 和 MEDIA_ROOT 的区别
【发布时间】:2014-07-24 05:24:14
【问题描述】:

这三个静态url有什么区别?

我不确定我是否正确,我正在使用MEDIA_ROOT 来存储我上传的照片(通过models.ImageField()

但是,我为我的管理员和admin.py 创建了一个 JS 脚本。我将媒体定义如下:

....
class Media:
      js = ('/admin/custom.js', )

还有我的settings.py

 ....
 STATIC_ROOT = "/home/user/project/django1/top/listing/static"

我将custom.js 添加到STATIC_ROOT/admin/custom.js,但它不起作用。抛出 404 not found 错误。

然后我将STATIC_ROOT 更改为STATICFILES_DIRS,就可以了!!

....
STATICFILES_DIRS = "/home/user/project/django1/top/listing/static"

所以,我不明白这里发生了什么。其实我就是不明白STATIC_ROOTSTATICFILES_DIRS有什么区别。

目前我正在通过 virtualenv 在我的机器上测试 Django,尚未部署,这是 STATIC_ROOT 无法正常工作的原因吗?

【问题讨论】:

标签: python django django-staticfiles django-static


【解决方案1】:

发展

STATIC_ROOT在开发过程中无用,仅在部署时需要。

在开发过程中,STATIC_ROOT 什么都不做。你甚至不需要设置它。 Django 在每个应用程序的目录 (myProject/appName/static) 中查找静态文件并自动提供它们。

这是manage.py runserverDEBUG=True 时所做的魔法。

部署

当您的项目上线时,情况会有所不同。您很可能会使用 Django 提供动态内容,而静态文件将由 Nginx 提供。为什么?因为 Nginx 非常高效,并且会减少 Django 的工作量。

这就是STATIC_ROOT 派上用场的地方,因为 Nginx 对您的 django 项目一无所知,也不知道在哪里可以找到静态文件。

所以你设置STATIC_ROOT = '/some/folder/' 并告诉Nginx 在/some/folder/ 中查找静态文件。然后你运行manage.py collectstatic,Django 会将静态文件从你拥有的所有应用程序复制到/some/folder/

静态文件的额外目录

STATICFILES_DIRS 用于包含附加目录供collectstatic 查找。例如,默认情况下,Django 不识别/myProject/static/。所以你可以自己包含它。

示例

STATIC_URL = '/static/'

if not DEBUG: 
    STATIC_ROOT = '/home/django/www-data/site.com/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static/'),
]

【讨论】:

  • 对 STATIC_ROOT 等的最佳解释。清晰简洁。这应该是 django 文档中的内容。
  • @Max Malysh 这是我们应该得到的答案水平。知道了! A+
  • 非常清楚。谢谢!
  • 谢谢!这个明确的答案比 Django 文档中令人困惑的文本要好得多。
【解决方案2】:

您可以在Django documentation 中找到这些设置。以下是我自己对文档的定义和引用:

  • MEDIA_ROOT 是使用FileField 上传的文件所在的文件夹。

    将包含user-uploaded files 的目录的绝对文件系统路径。

  • STATIC_ROOT是使用manage.py collectstatic后会存放静态文件的文件夹

    collectstatic 将收集用于部署的静态文件的目录的绝对路径。

    如果staticfiles contrib 应用程序已启用(默认),collectstatic 管理命令会将静态文件收集到此目录中。有关使用的更多详细信息,请参阅管理静态文件的操作指南。

  • STATICFILES_DIRS 是 Django 将在其中搜索除每个已安装应用程序的 static 文件夹之外的其他静态文件的文件夹列表。

    如果启用了FileSystemFinder finder,则此设置定义静态文件应用程序将遍历的其他位置,例如如果您使用collectstaticfindstatic 管理命令或使用静态文件服务视图。

在您的设置中,您应该:

MEDIA_ROOT = os.path.join(BASE_DIR, "media/")
STATIC_ROOT = os.path.join(BASE_DIR, "static/")

# Make a tuple of strings instead of a string
STATICFILES_DIRS = ("/home/user/project/django1/top/listing/static", )

...哪里:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

现在在默认的 Django settings.py 中定义。

【讨论】:

  • 这很容易成为 IMO 最清晰的答案,尽管我觉得这个问题绝对是骗人的
  • @MaximeLorant 老实说,您的解释比 Django 文档要好。
  • @MaximeLorant 构造精美的答案。正如 Jee 所说,比文档本身要清晰得多。
【解决方案3】:

STATICFILES_DIRSSTATIC_ROOT 之间的区别

STATICFILES_DIRS 可以包含带有静态文件的其他目录(不一定是应用程序目录),当您运行collectstatic 时,这些静态文件将被收集到您的 STATIC_ROOT 中。然后,这些静态文件将由您的 Web 服务器提供,它们将从您的 STATIC_ROOT 提供。

如果您的 STATIC_ROOT 中当前有您希望提供的文件,那么您需要将这些文件移动到不同的目录并将该其他目录放在 STATICFILES_DIRS 中。您的STATIC_ROOT 目录应该是空的,并且所有静态文件都应该收集到该目录中。

MEDIA_ROOT 媒体文件,所有上传文件的去向。 示例:图像、文件

【讨论】:

  • 感谢您的回答。希望我能接受超过 1 个问题的答案。你的回答对我也很有帮助。
【解决方案4】:
class Media:
      js = ('/admin/custom.js', )

但它不起作用。抛出 404 not found 错误。

404 错误的部分原因是文件路径中的前导斜杠。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-03
    • 2011-10-12
    • 2016-10-09
    • 2012-08-23
    • 1970-01-01
    • 2012-01-31
    • 2020-09-04
    • 1970-01-01
    相关资源
    最近更新 更多