STATICFILES_DIR、 STATIC_ROOT 与 MEDIA_ROOT 的区别

这三个静态 URL 有什么不同?

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

然而,我在管理员和 admin.py中创建了一个 JS 脚本:

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

and my settings.py:

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

and I added the custom.js to STATIC_ROOT/admin/custom.js, but it is not working. Throwing 404 not found error.

然后我把 STATIC_ROOT改成 STATICFILES_DIRS,就成功了! !

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

所以,我不明白这是怎么回事。事实上,我只是不明白 STATIC_ROOTSTATICFILES_DIRS有什么不同。

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

62715 次浏览

你可以在 姜戈文档中找到这些设置。下面是我自己的定义和文档中的引用:

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

    保存 用户上传的文件的目录的绝对文件系统路径。

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

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

    如果启用了 staticfiles贡献应用程序(默认情况下) ,则 collectstatic管理命令将收集静态文件到此目录中。有关使用的详细信息,请参阅如何管理静态文件。

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

    这个设置定义了如果启用了 FileSystemFinder查找器,staticfiles 应用程序将要遍历的其他位置,例如,如果您使用 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中定义。

STATICFILES_DIRSSTATIC_ROOT的区别

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

If you have files currently in your STATIC_ROOT that you wish to serve then you need to move these to a different directory and put that other directory in STATICFILES_DIRS. Your STATIC_ROOT directory should be empty and all static files should be collected into that directory.

媒体文件,所有上传的文件去 MEDIA_ROOT。 例如: 图片,文件

Development

STATIC_ROOT在开发过程中是无用的,它只是部署时需要的。

While in development, STATIC_ROOT does nothing. You don't even need to set it. Django looks for static files inside each app's directory (myProject/appName/static) and serves them automatically.

这就是 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/example.com/static/'


STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static/'),
]
class Media:
js = ('/admin/custom.js', )

但它不工作。抛出404没有发现错误。

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