运行 OpenShift 可扩展应用程序上的 Django 1.8

Running Django 1.8 on OpenShift scalable app

我在使用 python 2.7 的可扩展 OpenShift 平台上遇到问题 运行 Django(1.8.7) 应用程序。由于某种原因,它无法获取环境变量 OPENSHIFT_POSTGRESQL_DB_URL 的信息。那么这是错误:

 mod_wsgi (pid=69306): Target WSGI script '/var/lib/openshift/5d5/app-root/runtime/repo/wsgi/application' cannot be loaded as Python module.
 mod_wsgi (pid=69306): Exception occurred processing WSGI script '/var/lib/openshift/5d5/app-root/runtime/repo/wsgi/application'.
 Traceback (most recent call last):
   File "/var/lib/openshift/5d5/app-root/runtime/repo/wsgi/application", line 21, in <module>
     application = get_wsgi_application()
   File "/var/lib/openshift/5d5/python/virtenv/lib/python2.7/site-packages/Django-1.8.7-py2.7.egg/django/core/wsgi.py", line 14, in get_wsgi_application
     django.setup()
   File "/var/lib/openshift/5d5/python/virtenv/lib/python2.7/site-packages/Django-1.8.7-py2.7.egg/django/__init__.py", line 17, in setup
     configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
   File "/var/lib/openshift/5d5/python/virtenv/lib/python2.7/site-packages/Django-1.8.7-py2.7.egg/django/conf/__init__.py", line 48, in __getattr__
     self._setup(name)
   File "/var/lib/openshift/5d5/python/virtenv/lib/python2.7/site-packages/Django-1.8.7-py2.7.egg/django/conf/__init__.py", line 44, in _setup
     self._wrapped = Settings(settings_module)
   File "/var/lib/openshift/5d5/python/virtenv/lib/python2.7/site-packages/Django-1.8.7-py2.7.egg/django/conf/__init__.py", line 92, in __init__
     mod = importlib.import_module(self.SETTINGS_MODULE)
   File "/opt/rh/python27/root/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module
     __import__(name)
   File "/var/lib/openshift/5d5/app-root/runtime/repo/wsgi/bet/controller/settings.py", line 59, in <module>
     url = urlparse.urlparse(os.environ.get('OPENSHIFT_POSTGRESQL_DB_URL'))
   File "/opt/rh/python27/root/usr/lib64/python2.7/urlparse.py", line 143, in urlparse
     tuple = urlsplit(url, scheme, allow_fragments)
   File "/opt/rh/python27/root/usr/lib64/python2.7/urlparse.py", line 182, in urlsplit
     i = url.find(':')
 AttributeError: 'NoneType' object has no attribute 'find'

这就是我在 settings.py 中使用该变量的方式,之前有效:

import urlparse
DATABASES = {}
if ON_OPENSHIFT:
    url = urlparse.urlparse(os.environ.get('OPENSHIFT_POSTGRESQL_DB_URL'))

    DATABASES['default'] = {
        'ENGINE' : 'django.db.backends.postgresql_psycopg2',
        'NAME': os.environ['OPENSHIFT_APP_NAME'],
        'USER': url.username,
        'PASSWORD': url.password,
        'HOST': url.hostname,
        'PORT': url.port,
        }

这是我的 application 文件:

#!/usr/bin/env python

import os
import sys

sys.path.append(os.path.join(os.environ['OPENSHIFT_REPO_DIR'], 'wsgi', 'bet'))

os.environ['DJANGO_SETTINGS_MODULE'] = 'controller.settings'
virtenv = os.environ['OPENSHIFT_PYTHON_DIR'] + '/virtenv/'
virtualenv = os.path.join(virtenv, 'bin/activate_this.py')
try:
    execfile(virtualenv, dict(__file__=virtualenv))
except:
    pass

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

如果我通过 rhc ssh bet 登录到我的应用程序并尝试打印变量,它工作正常:

echo $OPENSHIFT_POSTGRESQL_DB_URL
postgresql://admin:password-mynick.rhcloud.com:port/

知道我错过了什么。我看起来 here 运气不好。

注意:我的应用名为 bet。但由于我将其移动到可扩展应用程序,我在 openshift 中创建了 abet 应用程序。我在 wsgi 文件夹中将应用程序名称保留为 bet。这可能会导致一些问题吗?

嗯,看起来有点像 bug in OpenShift。我尝试 restart/reload 应用程序,但没有成功。

$ rhc app stop -a appname
$ rhc app start -a appname

停止并启动应用程序使其正常运行。 (重新加载环境变量)

使用这个link

OpenShift Community

请耐心等待,他们会与您联系并为您提供帮助。

别忘了检查 openshift 日志文件夹

$ rhc ssh app-name

$ cd $OPENSHIFT_LOG_DIR

检查该文件夹中的日志文件,然后可能会为您的问题提供一些有用的信息,您可以更好地描述它以支持团队。