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

5
在我的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个回答

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__file.pyfilepath相关联。
对于settings.py,使用以下代码获取Django项目的根目录:
BASE_DIR = os.path.dirname(os.path.dirname(__file__))

您可以使用os.path.join()来连接其他相对路径,例如:

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

想要了解如何布置Django项目目录的更多信息,请查看这里:常见结构


3
通常的做法(也建议在Django官方教程中这样做)是设置一个BASE_DIR,从__file__中获取当前工作目录:
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

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

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

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

非常感谢您的及时回复。以BASE_DIR为例,如果我能看到它的值,它会是"/ home / ian / projectname / mysite /"吗?如果是这样,我该如何使用os.path.join进入另外两个文件夹?即/appname/static? - Ian Carpenter
通常情况下,静态根目录位于项目级别而不是应用级别。如果你有多个具有自己静态文件的应用程序-使用内置的staticfiles应用程序,详见Managing static files - alecxe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接