如何设置STATIC_ROOT和MEDIA_ROOT所以使用的路径不是硬编码的?

时间:2014-07-20 20:50:21

标签: django django-settings django-1.6 os.path

在我的settings.py文件中,STATIC_ROOTMEDIA_ROOT都指向硬编码位置。例如,STATIC_ROOT路径为:

/home/ian/projectname/mysite/appname/static

我知道在部署项目时会出现问题。

环顾四周我可以看到我需要使用os.path,但无数的例子让我感到困惑。

我试图查看设置此文件的不同排列(或获取用于设置BASE_DIR的示例值)但是因为屏幕截图显示我遗漏了某些东西,因为它抱怨文件价值。

如果需要,我正在使用Django 1.6

提前致谢。

enter image description here

2 个答案:

答案 0 :(得分:5)

首先,由于在交互式shell中附加__file__,您收到此错误:

NameError: name '__file__' is not defined

shell无法检测到__file__中的当前文件路径,因为它与您添加此行的filepath相关。例如,要使用,您需要在file.py

中包含此内容
os.path.join(os.path.dirname(__file__))

然后,从命令行运行:

python file.py

这是因为__file__filepath的{​​{1}}有关。

file.py的情况下,使用它来获取Django项目的根目录:

settings.py

然后,您可以使用BASE_DIR = os.path.dirname(os.path.dirname(__file__)) 加入其他相对路径,例如:

os.path.join()

有关如何布置Django项目目录的更多信息,请阅读:Common structures

答案 1 :(得分:3)

通常的做法(也在django official tutorial中建议)是设置BASE_DIR设置,从__file__获取当前工作目录:

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

然后,使用os.path.join()构建其他相对路径,例如:

STATIC_ROOT = os.path.join(BASE_DIR, 'static')

请注意__file__仅适用于模块,在控制台上使用它没有意义。