当我浏览当前项目中的settings.py文件时,我意识到我不太确定python在os.path.join方面到底发生了什么

我尝试查找它,但是有点混乱-当您深入研究时似乎有点深奥。

因此,让我们看下面的例子:

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

我想从这个例子中回答几点:

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',

    )

我想从这个例子中回答一些问题:

  1. ON_OPENSHIFT在哪里定义?

  2. 为什么在本地(语句的其他部分)出现一个本地目录绝对路径,但是为什么不使用某种动态确定的路径(例如os.path.join东西)呢?

  3. 为什么ON_OPENSHIFT不需要指定静态目录? 它是如何“知道”的? 好像正在发生某种魔术。

===============>>#1 票数:4 已采纳

为什么要使用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 此设置表示if ON_OPENSHIFT设置为True ,则运行这些设置,否则运行其他设置。

这可能是在早期使用环境变量settings.py文件中调用的。 因此,在他的Openshift机器上,他可能将环境变量“ OPENSHIFT”设置为True 然后,在他的settings.py ,他有类似的内容:`ON_OPENSHIFT = os.environ.get('OPENSHIFT','False')。 这就是说“获取OPENSHIFT的环境变量。如果没有,则将其设置为False。无论结果如何,都将其设置为ON_OPENSHIFT。

2)本地版本不需要使用绝对路径。 这可能是您朋友的选择,尽管有些奇怪。

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

  ask by ApathyBear translate from so

未解决问题?本站智能推荐:

2回复

django / python:从字典获取值时出错

我在dotcloud和redhat openshift上托管了python / django代码。 为了处理不同的用户,我使用令牌并将其保存在字典中。 但是当我从字典中获取值时,有时会抛出错误(键值错误)。 以下代码通过javascript xmlhttprequest发送到服务器,
1回复

适用于python 2.7和Django 1.7的OpenShift HTTPS

我正在尝试在OpenShift上为基于Django的Web应用程序强制执行HTTPS重定向,但是遵循如何将流量重定向到HTTPS似乎没有任何效果。 我已经将.htaccess文件放在repo根目录和wsgi文件夹中,但是它只是被忽略了,我仍然可以通过HTTP浏览。 我在这里想念什么?
1回复

如何在python / Django Openshift Cartrdige上绑定内部端口

我是openshift,django和python的新手,很难为我要在openshift上安装的python应用程序提供两个内部端口。 我阅读了有关此操作的先前文章,并且在action_hook / deploy中使用下面的代码未成功。 我还尝试通过SSH在python shell中
1回复

ImportError at /在Django中没有名为'wsgi'的模块

好吧,正如标题所述,尝试从另一个应用程序导入类时,我经常遇到上述错误。 我的文件结构如下所示(我在openshift btw上): 我的导入看起来像这样: 我也尝试过: 但是这两个语句都给我错误:“ ValueError at /尝试相对导入超出顶级包” ws
2回复

Django / Openshift中的样式表和sqlite

我遇到了Openshift / Django问题: 我很难在Openshift中使用样式表和SQLite数据库。 尝试访问使用数据库的页面时,我收到以下Django调试消息:“ no such table:mytable”。 我在rhc尾巴上得到相同的结果。 其他一切似乎都起作用。
2回复

在OpenShift上使用Django

关于这个问题,我正在尝试在OpenShift上部署Django,但是在理解OpenShift时遇到了一些问题。 我已经设法通过git repo https://github.com/openshift/django-example设置了一个快速应用程序,但是有以下问题: git克
1回复

Openshift Django Scaling

我正在Python 3.3上的OpenShift上创建Django应用程序, no scaling ,它工作正常。 所以当我浏览应用程序时给我一个django url错误,并且/ admin给我带来了管理员登录页面。 但是当我用scaling创建它时,我得到了这个错误 503服
3回复

使用Django的Openshift上的静态文件

我找不到像css,js和picture这样的静态文件。 我得到404错误页面。 在我的设置django我有 我的文件系统是 我试图在之前创建的wsgi文件 夹中移动静态文件 夹 。 我还试图在 openshift的数据文件夹中移动我的静态文件夹或wsgi文件夹,但没有成
2回复

在Openshift Django中使用Bower

我在Openshift中有一个带Python 2.7和Mysql 5.5墨盒的应用程序,我想在其上运行Django应用程序。 我用它来开始构建应用程序。 在本地,我使用bower作为程序包管理器,因此我已经安装了django-bower,因此可以进行./manage.py bower i
1回复

如何在OpenShift上配置Django? [关闭]

我最近尝试在OpenShift上导出一个Django项目,但是没有成功。 我找到的唯一解决方案是“预建”解决方案(例如https://github.com/openshift/django-example )。 我花了几个小时试图使它适应我的项目,但我总是遇到内部服务器错误。 那么