STATICFILES_DIR、STATIC_ROOT 和 MEDIA_ROOT 的区别

145 投票
4 回答
77569 浏览
提问于 2025-04-18 08:27

这三种静态网址有什么区别呢?

我不太确定自己理解得对不对,我用 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.js 加到了 STATIC_ROOT/admin/custom.js,但是它不工作,出现了 404 找不到的错误。

然后我把 STATIC_ROOT 改成了 STATICFILES_DIRS,结果就能正常工作了!!

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

所以,我不太明白这是怎么回事。实际上,我就是不明白 STATIC_ROOTSTATICFILES_DIRS 之间有什么区别。

目前我在我的电脑上通过虚拟环境测试 Django,还没有部署,这会是 STATIC_ROOT 不工作的原因吗??

4 个回答

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

但是它没有工作,出现了404未找到的错误。

这个404错误部分是因为文件路径前面有一个斜杠。

30

STATICFILES_DIRSSTATIC_ROOT的区别

STATICFILES_DIRS可以包含其他目录(不一定是应用程序的目录),这些目录里放的是静态文件。当你运行collectstatic命令时,这些静态文件会被收集到你的STATIC_ROOT目录里。之后,这些静态文件会由你的网页服务器提供服务,并且会从STATIC_ROOT目录中提供。

如果你在STATIC_ROOT目录里有一些文件想要提供服务,你需要把这些文件移动到另一个目录,然后把这个新目录放到STATICFILES_DIRS里。你的STATIC_ROOT目录应该是空的,所有的静态文件都应该被收集到这个目录里。

MEDIA_ROOT是用来存放媒体文件的地方,也就是所有上传的文件。比如:图片、文件等。

258

开发阶段

STATIC_ROOT 在开发阶段是没用的,它只在项目上线时需要。

在开发时,STATIC_ROOT 不起作用,你甚至不需要设置它。Django 会在每个应用的目录里找静态文件(比如 myProject/appName/static),并自动提供这些文件。

这就是当你用 manage.py runserver 并且 DEBUG=True 时,Django 所做的神奇事情。

上线部署

当你的项目上线后,情况就不一样了。你很可能会用 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/'),
]
167

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

  • MEDIA_ROOT 是一个文件夹,所有通过 FileField 上传的文件都会放在这里。

    这是一个绝对的文件系统路径,用于存放用户上传的文件

  • STATIC_ROOT 是一个文件夹,静态文件会在使用 manage.py collectstatic 后存放在这里。

    这是一个绝对路径,用于存放 collectstatic 收集的静态文件,以便进行部署。

    如果启用了 staticfiles 这个附加应用(默认是启用的),那么 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 中定义的。

撰写回答