当我查看当前项目中的 settings.py 文件时,我意识到我不太确定 python 的幕后到底发生了什么 os.path.join
我尝试查找它,但它有点令人困惑 - 当你深入研究时似乎有点深奥。
让我们看下面的例子:
os.path.join(PROJECT_DIR, 'templates'),
我想从这个例子中回答一些要点:
1。 os.path.join 到底在做什么?到底加入了什么?
2.什么是PROJECT_DIR? PROJECT_DIR 在哪里设置以及 PROJECT_DIR 本身如何始终指向项目目录,无论其位置如何(在服务器上、本地等上)?
现在让我们考虑这个例子(我从我的 friend 那里得到的),这使得当我在服务器上运行时(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不需要指定静态目录?它如何“知道”?似乎有某种魔法正在发生。
最佳答案
为什么使用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”。阅读docs上os.path.join()
有关其工作原理的更多详细信息,当您不知道要运行的操作系统时,这非常有用。
其他问题
1) ON_OPENSHIFT 可能在 settings.py
中较早设置。文件。它应该是一个 bool 值,因此要么 True
或False
。此设置表示 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) 本地版本不需要使用绝对路径。这很可能是你 friend 的选择,尽管有点奇怪。
3)我猜缺少一些代码。 STATICFILES_DIRS
中应该有一些东西当 ON_OPENSHIFT 为 True 时。没有什么魔法;当 ON_OPENSHIFT 为 True 时,该设置将不起作用。
关于python - Django/python : Understanding paths in django,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23177708/