107

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

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

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

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

我的settings.py

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

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

然后我将其更改STATIC_ROOTSTATICFILES_DIRS,它的工作原理!

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

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

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

4

4 回答 4

181

发展

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/'),
]
于 2016-10-30T15:55:55.307 回答
149

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

  • MEDIA_ROOT是上传文件的文件夹FileField

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

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

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

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

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

    此设置定义了静态文件应用程序在启用查找器时将遍历的其他位置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", )

...在哪里:

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

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

于 2014-06-03T18:42:26.153 回答
29

STATICFILES_DIRS和之间的区别STATIC_ROOT

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

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

MEDIA_ROOT媒体文件在哪里,所有上传的文件都在哪里。示例:图像、文件

于 2014-06-03T18:43:50.537 回答
0
class Media:
      js = ('/admin/custom.js', )

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

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

于 2021-02-26T20:19:40.127 回答