STATICFILES_DIR,STATIC_ROOT和MEDIA_ROOT之间的差异

dev*_*jim 54 python django django-static django-staticfiles

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

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

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

....
class Media:
      js = ('/admin/custom.js', )
Run Code Online (Sandbox Code Playgroud)

和我的settings.py:

 ....
 STATIC_ROOT = "/home/user/project/django1/top/listing/static"
Run Code Online (Sandbox Code Playgroud)

我添加了custom.jsSTATIC_ROOT/admin/custom.js,但它不工作.投掷404未找到错误.

然后我改变STATIC_ROOTSTATICFILES_DIRS,和它的作品!

....
STATICFILES_DIRS = "/home/user/project/django1/top/listing/static"
Run Code Online (Sandbox Code Playgroud)

所以,我不明白这里发生了什么.事实上,我只是不明白STATIC_ROOT和之间有什么区别STATICFILES_DIRS.

目前我正在通过virtualenv在我的机器上测试Django,还没有部署,这是STATIC_ROOT不工作的原因??

Max*_*ant 84

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

  • MEDIA_ROOT是使用上传文件的文件夹FileField.

    用于保存用户上载文件的目录的绝对文件系统路径.

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

    collectstatic将收集静态文件以进行部署的目录的绝对路径.

    如果staticfiles启用了contrib应用程序(默认),则collectstatic管理命令将收集静态文件到此目录中.有关使用的更多详细信息,请参阅有关管理静态文件的方法.

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

    此设置定义的其他位置,如果该staticfiles应用程序会遍历FileSystemFinder如果使用启用取景器,如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", )
Run Code Online (Sandbox Code Playgroud)

...哪里:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
Run Code Online (Sandbox Code Playgroud)

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

  • 这很容易成为IMO最明智的答案,尽管我觉得这个问题是一个明确的愚蠢行为 (2认同)
  • @MaximeLorant老实说,你的解释比Django文档更好. (2认同)
  • @MaximeLorant 构造精美的答案。正如 Jee 提到的,比文档本身清楚得多。 (2认同)

Max*_*ysh 83

发展

STATIC_ROOT 在开发过程中没用,它只需要部署.

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

这是什么manage.py runserver时候完成的魔术DEBUG=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/'),
]
Run Code Online (Sandbox Code Playgroud)

  • STATIC_ROOT等的最佳解释清晰简洁.这是django文档中应该包含的内容. (13认同)
  • @Max Malysh,这就是我们应该得到的答案。知道了!A+ (3认同)
  • 说明了很多。谢谢! (2认同)
  • 您甚至不必添加 `STATICFILES_DIRS` (如果您没有其他目录来提供文件),您可以将 `static(...)` 函数添加到 urls.py 中的 `urlpatterns` 中,如上所述文档中的仅在调试模式下工作。 (2认同)

Pra*_*aur 19

STATICFILES_DIRS和之间的区别STATIC_ROOT

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

如果您希望提供STATIC_ROOT中的文件,那么您需要将这些文件移动到另一个目录并将其他目录放入其中STATICFILES_DIRS.您的STATIC_ROOT目录应为空,并且应将所有静态文件收集到该目录中.

MEDIA_ROOT媒体文件,所有上传的文件.示例:图像,文件

  • 谢谢你的回答.希望我能接受超过1个答案的问题.你的回答对我也很有帮助. (4认同)