Django/python:理解Django中的路径
在我查看当前项目的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',
)
我想从这个例子中得到的一些问题:
ON_OPENSHIFT是在哪里定义的?
为什么在本地(语句的else部分)似乎有一个本地目录的绝对路径,但为什么不使用某种动态获取的路径(像os.path.join那样)?
为什么ON_OPENSHIFT不需要指定静态目录?它是怎么“知道”的?感觉像是有什么魔法在发生。
1 个回答
为什么要使用 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
文件的前面就设置好了。它应该是一个布尔值,也就是 True
或 False
。这个设置的意思是,如果 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 时,这个设置是无法工作的。