STATICFILES_DIR、STATIC_ROOT 和 MEDIA_ROOT 的区别
这三种静态网址有什么区别呢?
我不太确定自己理解得对不对,我用 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_ROOT
和 STATICFILES_DIRS
之间有什么区别。
目前我在我的电脑上通过虚拟环境测试 Django,还没有部署,这会是 STATIC_ROOT
不工作的原因吗??
4 个回答
class Media: js = ('/admin/custom.js', )
但是它没有工作,出现了404未找到的错误。
这个404错误部分是因为文件路径前面有一个斜杠。
STATICFILES_DIRS
和STATIC_ROOT
的区别
STATICFILES_DIRS
可以包含其他目录(不一定是应用程序的目录),这些目录里放的是静态文件。当你运行collectstatic
命令时,这些静态文件会被收集到你的STATIC_ROOT
目录里。之后,这些静态文件会由你的网页服务器提供服务,并且会从STATIC_ROOT
目录中提供。
如果你在STATIC_ROOT
目录里有一些文件想要提供服务,你需要把这些文件移动到另一个目录,然后把这个新目录放到STATICFILES_DIRS
里。你的STATIC_ROOT
目录应该是空的,所有的静态文件都应该被收集到这个目录里。
MEDIA_ROOT
是用来存放媒体文件的地方,也就是所有上传的文件。比如:图片、文件等。
开发阶段
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/'),
]
你可以在Django文档中找到这些设置。以下是我自己的解释和文档中的引用:
MEDIA_ROOT
是一个文件夹,所有通过FileField
上传的文件都会放在这里。这是一个绝对的文件系统路径,用于存放用户上传的文件。
STATIC_ROOT
是一个文件夹,静态文件会在使用manage.py collectstatic
后存放在这里。这是一个绝对路径,用于存放
collectstatic
收集的静态文件,以便进行部署。如果启用了
staticfiles
这个附加应用(默认是启用的),那么collectstatic
命令会把静态文件收集到这个文件夹里。关于如何管理静态文件的更多细节,可以查看相关的使用说明。STATICFILES_DIRS
是一个文件夹列表,Django 会在这些文件夹中查找额外的静态文件,除了每个已安装应用的static
文件夹。这个设置定义了如果启用了
FileSystemFinder
查找器,静态文件应用会遍历的额外位置。例如,如果你使用collectstatic
或findstatic
命令,或者使用静态文件服务视图。
在你的设置中,你应该有:
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
中定义的。