2014-07-20 41 views
4

在我的settings.py文件中,STATIC_ROOTMEDIA_ROOT都指向硬编码的位置。例如,STATIC_ROOT路径是:如何设置STATIC_ROOT和MEDIA_ROOT,以便使用的路径不被硬编码?

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

我知道这会造成问题,当我部署我的项目。

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

我试图查看设置此文件(或获取示例值用于设置BASE_DIR)的不同排列,但因为屏幕快照显示我缺少一些东西,因为它抱怨文件值。

在需要的情况下,我使用Django 1.6

在此先感谢。

enter image description here

回答

4

首先,您正在接收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,请使用BASE_DIR = os.path.dirname(os.path.dirname(__file__))来获取Django项目的根目录。然后,您可以使用os.path.join()加入其他相对路径,如:

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

有关如何布置你的Django项目目录,看到Django directory structure?更多信息。

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__仅适用于该模块,因此在控制台上使用它是没有意义的。

+0

感谢您的快速响应,使用BASE_DIR的例子,如果我能够看到它的值是“/ home/ian/projectname/mysite /”吗?如果是这样,我该如何使用os.path.join去另外两个文件夹?即/ appname/static? –

+0

@IanCarpenter很好,通常静态根在项目级别,而不是应用程序级别。如果你有多个应用程序和自己的静态文件 - 使用'staticfiles'内置的应用程序,请参阅[管理静态文件](https://docs.djangoproject.com/en/dev/howto/static-files/) 。 – alecxe

相关问题