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)
我想从这个例子中回答的一些问题:
ON_OPENSHIFT 在哪里定义?
为什么本地(语句的 else 部分)似乎有一个本地目录绝对路径,但为什么不使用某种类型的动态确定的路径(如 os.path.join 的东西)?
为什么 ON_OPENSHIFT 不需要指定静态目录?它是如何“知道”的?似乎某种魔法正在发生。
使用os.path.join()(和其他os.path函数)有助于避免在 Django 项目中设置硬编码路径。这样,您的项目就可以在具有不同目录结构的不同计算机上运行,而无需重新编码所有内容。在您的计算机上,路径可能是“C:/ApathyBear/Django/mydjango”,而在我的计算机上则是"Users/Alex/django"
通常在 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文件中较早地设置。它应该是一个布尔值,因此无论是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)本地版本不需要使用绝对路径。这可能是你朋友的选择,虽然有点奇怪。
3) 我猜缺少一些代码。STATICFILES_DIRS当 ON_OPENSHIFT 为 True 时,for 中应该有一些东西。没有魔法;当 ON_OPENSHIFT 为 True 时,该设置将不起作用。