python - Django/python : Understanding paths in django

标签 python django openshift

当我查看当前项目中的 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',

    )

我希望通过此示例回答一些问题:

  1. ON_OPENSHIFT 在哪里定义?

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

  3. 为什么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”。阅读docsos.path.join()有关其工作原理的更多详细信息,当您不知道要运行的操作系统时,这非常有用。

其他问题

1) ON_OPENSHIFT 可能在 settings.py 中较早设置。文件。它应该是一个 bool 值,因此要么 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) 本地版本不需要使用绝对路径。这很可能是你 friend 的选择,尽管有点奇怪。

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

关于python - Django/python : Understanding paths in django,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23177708/

相关文章:

python - 取消堆叠多索引数据帧

python - 如何在 Django ORM 中使用 PostGIS 聚合函数 ST_AsMVT

kubernetes - 在Kubernetes configMaps中使用敏感的环境变量

java - Openshift - javabean 每两秒创建一次

python - Cythonize 具有复数数组的 C 函数

python - 如何改进 Python 中 try 语句的重复使用?

python - 使用python在django中将数据库转换为csv

jquery - 如何在 Django 中正确执行 AJAX 请求

kubernetes - 服务帐户角色绑定(bind)不适用于 API 访问

python - pymongo 获取 E11000 重复键错误索引 pymongo 错误