Django/python:理解Django中的路径

2 投票
1 回答
575 浏览
提问于 2025-04-18 03:27

在我查看当前项目的settings.py文件时,我发现自己对python中的os.path.join到底是怎么回事不是很清楚。

我试着查了一下,但感觉有点复杂,深入了解后似乎又有点难以理解。

所以我们来看一个例子:

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

我想从这个例子中得到一些答案:

1. os.path.join到底在做什么?它具体是把什么连接起来的?

2. 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部分)似乎有一个本地目录的绝对路径,但为什么不使用某种动态获取的路径(像os.path.join那样)?

  3. 为什么ON_OPENSHIFT不需要指定静态目录?它是怎么“知道”的?感觉像是有什么魔法在发生。

1 个回答

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,或者你自己设置的其他名称),那么接下来设置其他目录就简单多了。使用 os.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。这个设置的意思是,如果 ON_OPENSHIFT 被设置为 True,那么就运行这些设置,否则就运行其他设置。

这可能是在 settings.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 时,这个设置是无法工作的。

撰写回答