Django / python:了解django中的路径

时间:2014-04-20 02:12:57

标签: python django openshift

当我查看当前项目中的settings.py文件时,我意识到我并不确定在os.path.join

方面的python下真正发生的事情

我试着查了一下,但它有点令人困惑 - 当你深入钻研时似乎有点深奥。

所以让我们举几个例子:

os.path.join(PROJECT_DIR, 'templates'),

我想从这个例子中回答一些问题:

1。 os.path.join到底在做什么?究竟加入了什么?

2.什么是PROJECT_DIR?设置PROJECT_DIR的位置以及PROJECT_DIR本身如何始终指向项目目录,无论其位置如何(在服务器上,本地等)?

现在让我们考虑一下这个例子(我从我的朋友那里得到的),这就是当我在服务器上运行(ON_OPENSHIFT似乎是我的主机)时,我使用了一个特定的静态目录:

if ON_OPENSHIFT:
    STATICFILES_DIRS = (
        # Put strings here, like "/home/html/static" or "C:/www/django/static".
        # Always use forward slashes, even on Windows.
        # Don't forget to use absolute paths, not relative paths.


    )
else:
    STATICFILES_DIRS = (
        # Put strings here, like "/home/html/static" or "C:/www/django/static".
        # Always use forward slashes, even on Windows.
        # Don't forget to use absolute paths, not relative paths.
        '/Users/tom/candycode/wsgi/static',

    )

我想从这个例子中回答一些问题:

  1. ON_OPENSHIFT定义在哪里?

  2. 为什么本地(语句的else部分)似乎有一个本地目录absolue路径,但为什么不使用某种类型的动态确定路径(比如os.path.join的东西)?< / p>

  3. 为什么ON_OPENSHIFT不需要指定静态目录?它是如何只是&#34;知道&#34;?似乎某种魔法正在发生。

1 个答案:

答案 0 :(得分:4)

为什么要使用os.path.join():

使用os.path.join()(和其他os.path函数)有助于避免在Django项目中设置硬编码路径。这样,您的项目可以在具有不同目录结构的不同计算机上运行,​​而无需重新编码所有内容。在您的计算机上,路径可能是“C:/ ApathyBear / Django / mydjango”,而在我的计算机上它将是"Users/Alex/django"

Django settings.py和PROJECT_DIR

通常在Django项目中设置的方式是PROJECT_DIR设置。这将是PROJECT_DIR = os.path.dirname(os.path.dirname(__file__)),它将获取当前文件(settings.py),返回目录名称,然后返回包含该目录的目录名称。它通常会在您的项目根目录中结束(可能会因您的具体设置而异)。

一旦你有PROJECT_DIR(或BASE_DIR,或者你设置的任何内容),那么最简单的方法是设置目录。使用os.path.join()会合并您放入的项目。因此,当您放入os.path.join(PROJECT_DIR, 'templates')时,如您的示例所示,它会将templates添加到您的PROJECT_DIR中。我猜这是TEMPLATE_DIRS设置的值,所以你的项目现在知道你的计算机或“Users / Alex / django / templates”中的“C:/ ApathyBear / Django / mydjango / templates” “在我的电脑上。请阅读os.path.join()上的docs以获取有关其工作原理的详细信息,这在您不知道要运行的操作系统时非常有用。

其他问题

1)ON_OPENSHIFT可能在settings.py文件的前面设置。它应该是布尔值,因此TrueFalse。此设置表示if ON_OPENSHIFT设置为True,然后运行这些设置,否则运行其他设置。

这可能是使用Environment Variablesettings.py文件中提前调用的。因此,在他的Openshift机器上,他可能将环境变量“OPENSHIFT”设置为True。然后,在他的settings.py中,他有类似的东西:`ON_OPENSHIFT = os.environ.get('OPENSHIFT','False')。这是说“获取OPENSHIFT的环境变量。如果没有,则将其设置为False。无论结果如何,将其设置为等于ON_OPENSHIFT。

2)本地版本不需要使用绝对路径。这可能是你朋友的选择,虽然有点奇怪。

3)我猜测有些代码丢失了。当ON_OPENSHIFT为True时,STATICFILES_DIRS中应该有一些内容。没有魔力;当ON_OPENSHIFT为True时,该设置将不起作用。