Django/python:了解 Django 中的路径

Apa*_*ear 2 python django openshift

当我在当前项目中查看我的 settings.py 文件时,我意识到我不太确定 python 引擎盖下到底发生了什么 os.path.join

我尝试查找它,但它有点令人困惑 - 当你深入研究时似乎有点深奥。

因此,让我们以以下示例为例:

os.path.join(PROJECT_DIR, 'templates'),
Run Code Online (Sandbox Code Playgroud)

我想从这个例子中回答一些观点:

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',

    )
Run Code Online (Sandbox Code Playgroud)

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

  1. ON_OPENSHIFT 在哪里定义?

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

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

Ale*_*lex 5

为什么使用 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,或任何你设置的),那么最容易设置目录。Usingos.path.join()结合了您放入的项目。因此,当您放入 时os.path.join(PROJECT_DIR, 'templates'),如您的示例所示,它将添加templates到您的 PROJECT_DIR。我猜这是TEMPLATE_DIRS设置的值,所以您的项目现在知道在您的计算机的“C:/ApathyBear/Django/mydjango/templates”或我的计算机上的“Users/Alex/django/templates”中查找。阅读文档os.path.join()关于它的工作原理,当你不知道你会来上运行的操作系统是真正有用的更多细节。

其他问题

1) ON_OPENSHIFT 可能在settings.py文件中较早地设置。它应该是一个布尔值,因此无论是TrueFalse。此设置是说if ON_OPENSHIFT设置为True,然后运行这些设置,否则运行其他设置。

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

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

3) 我猜缺少一些代码。STATICFILES_DIRS当 ON_OPENSHIFT 为 True 时,for 中应该有一些东西。没有魔法;当 ON_OPENSHIFT 为 True 时,该设置将不起作用。