django 中 STATICFILES_DIRS 的路径
Posted
技术标签:
【中文标题】django 中 STATICFILES_DIRS 的路径【英文标题】:path of STATICFILES_DIRS in django 【发布时间】:2012-04-20 09:02:08 【问题描述】:我来自 php 背景,想给出路径
STATICFILES_DIRS
在 settings.py 和 windows 中,我知道我需要提供完整的路径,例如:
D:/path/to/folder/project/static
我想知道有没有办法给出像“/static/”这样的路径,或者我们可以在 PHP 中给出像dirname(__FILE__)
这样的路径?
这样我的路径就不会被硬编码。另外为什么它是物理路径,因为网络服务器通常不遵循物理路径来加载 CSS 文件,因为它使用 http 路径?那么为什么在 django 中是这种方式(物理路径)?谁能解释一下。
提前感谢大家的努力。
【问题讨论】:
【参考方案1】:在我的 settings.py 文件中,我总是这样做
import os
ROOT_PATH = os.path.dirname(__file__)
那你就可以了
STATICFILES_DIRS = [os.path.join(ROOT_PATH, 'static')]
STATICFILES_DIRS
想要一个文件系统路径的原因是它需要知道文件在操作系统中的位置(所以像manage.py collectstatic
这样的事情是可能的)。 STATIC_URL
设置用于网络服务器路径,这就是它用来在管理员或% static %
标记或其他任何内容中向用户显示的内容。 STATICFILES_DIRS
仅在服务器端,永远不会出现在任何呈现的模板或任何东西中。
【讨论】:
所以如果 STATICFILES_DIRS 路径不正确,那么 STATIC_URL 也将无法在服务器上找到静态文件夹?.. @Hafiz 不完全是。如果STATIC_URL
是/static
并且您有一个带有<img src=" STATIC_URL /images/foo.png" />
的模板,那么这将很好地呈现(假设您的网络服务器设置正确以从静态目录中提供服务)——这与STATICFILES_DIRS
(或 Django,就此而言)。但如果设置不正确,那么需要能够找到实际文件的 Django 端的东西(例如 manage.py collectstatic
或为您的静态文件提供服务的 manage.py runserver
开发服务器)将无法正常工作。
这是错误的。我收到下一个错误“配置不当:您的 STATICFILES_DIRS 设置不是元组或列表;也许您忘记了尾随逗号?”
@Rusfearuth 抱歉;您可以在我所说的内容周围添加括号(现已编辑)。你的回答会有所不同。【参考方案2】:
在项目中找到settings.py文件,
放:
STATICFILES_DIRS=(os.path.join(BASE_DIR,'static'))
改为:
STATICFILES_DIRS=[(os.path.join(BASE_DIR,'static'))]
【讨论】:
【参考方案3】:你的问题的答案是错误的。如果你这样做,你会得到下一个错误:
ImproperlyConfigured: Your STATICFILES_DIRS setting is not a tuple or list; perhaps you forgot a trailing comma?
我的决定是在 settings.py 文件的顶部添加下一个函数:
导入操作系统 def look_folder_tree(根): 结果 = () 对于 os.walk(root) 中的 dir_name、sub_dirs、file_names: 对于 sub_dirs 中的 sub_dir_name: 结果 += (os.path.join(dir_name, sub_dir_name),) 返回结果 # 项目的 Django 设置。 PROJECT_DIR = os.path.dirname(__file__)并在以下位置调用 look_folder_tree 函数:
# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/var/www/example.com/static/"
STATIC_ROOT = os.path.join(PROJECT_DIR, 'static')
# URL prefix for static files.
# Example: "http://example.com/static/", "http://static.example.com/"
STATIC_URL = '/static/'
# Additional locations of static files
STATICFILES_DIRS = look_folder_tree(STATIC_ROOT)
我的决定是允许在静态目录中添加所有子文件夹。
【讨论】:
我也会研究您的解决方案,但是,我在上面标记了正确,因为这对我有用 不适合我,我有: STATICFILES_DIRS = ( os.path.join(BASE_DIR, '..', 'static'),) 。同时,STATIC_ROOT 被注释掉,没有被使用。所以现在我的开发静态文件正在工作。如果我使用“collectstatic”管理命令,我必须注释 STATICFILES_DIRS 而不是注释 STATIC_ROOT。很少见。【参考方案4】:在settings.py
中:
导入os(在创建django项目时已经完成)
import os
您可以只使用 STATICFILES_DIRS 作为元组,注意结尾的逗号。
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
或者您可以使用 STATICFILES_DIRS 作为列表数据类型,此处不需要末尾的逗号:
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
【讨论】:
【参考方案5】:改变这个:
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'))
到这里:
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'),)
最后加一个逗号,
ERRORS:
?: (staticfiles.E001) The STATICFILES_DIRS setting is not a tuple or list.
HINT: Perhaps you forgot a trailing comma?
【讨论】:
【参考方案6】:你的语法是正确的,我想你忘记在第一行代码中将 os 导入为 import os。
【讨论】:
感谢您的时间和帮助,您可以考虑用正确的语法示例给出答案吗?这可以帮助其他人从您的帖子中获得快速解决方案。 是的,你必须在一开始就导入 os。我没有提到它,因为我认为这很明显。此外,当您创建 django 项目时,导入行已经存在于settings.py
以上是关于django 中 STATICFILES_DIRS 的路径的主要内容,如果未能解决你的问题,请参考以下文章
Django静态文件的加载以及STATIC_ROOT 与STATICFILES_DIRS的区别