在Django 2中遇到静态文件问题。
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATE_DIR = os.path.join(BASE_DIR, "templates")
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR + '/static/'
STATICFILES_DIR = [
(BASE_DIR + "static/"),
]
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]
我的静态结构如下所示
我得到404静力学。尝试了不同的事情但没有成功。 btw collectstatic已经完成了。另一件事是当我在静态文件夹中进行更改时,collectstatic不会收集任何内容。它说“未经修改”。
我是Django的新手。感谢您的帮助。
更新2:
,设置就像
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static' )
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static_files')
]
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]
当我尝试收集静止时,没有变化。好像不收集。并且404自然地返回静态,因为它没有收集。
答案 0 :(得分:2)
有两个问题:
1。是Digitiain在his answer中指出的语法错误:
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
2。您无法将STATIC_ROOT
中的路径添加到STTATICFILES_DIRS
。因此,如果您的STTATICFILES_DIRS
如上所示,则STATIC_ROOT
不能为os.path.join(BASE_DIR, "static")
。
第一点应该是相当清楚的。第二个也在一开始就困惑了我。但实际上它很有道理:
在STATICFILES_DIRS
中,您告诉django去哪里寻找静态文件。这主要不是为了服务他们,而是为了收集它们!关键是在生产服务器上,django不应该服务于静态文件,这个任务应该由Web服务器处理。 Check the docs for details.我的想法是你运行命令python manage.py collectstatic
,django将遍历STATICFILES_DIRS
中的所有路径,收集静态文件并将它们放入...... - 完全正确! - 在STATIC_ROOT
文件夹中。现在很明显为什么STATIC_ROOT
文件夹不能真正成为STATICFILES_DIRS
的一部分,因为这意味着django需要将文件夹放入其中。同样,这是一个高效的服务器。在开发过程中,django可以在没有Web服务器帮助的情况下处理静态文件,here更多来自文档。
我希望这有助于澄清STATICFILES_DIRS
和STATIC_ROOT
之间的关系。底线:为STATIC_ROOT
选择不同的路径,你应该好好去!
作为示例,您可以拥有如下项目结构:
base_dir/
- static/
- css/
- js/
- ...
- static_collected/
- ...
然后定义:
是有效的# settings.py
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
STATIC_ROOT = os.path.join(BASE_DIR, "static_collected")
答案 1 :(得分:1)
这可能是一个红色的鲱鱼,但在Django docs中,设置相对于BASE_DIR的路径的语法包括os.path.join
,所以你的看法如下:
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
编辑:我也注意到你引用了DIR
而不是DIRS
,这可能会引起悲伤。与templates同上。