在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):目标WSGI脚本'/ var / lib / openshift / 5d5 / app-root / runtime / repo / wsgi / application'不能作为Python模块加载。
mod_wsgi(pid = 69306):异常发生处理WSGI脚本'/ var / lib / openshift / 5d5 / app-root / runtime / repo / wsgi / application'。
追溯(最近的最后一次调用):
文件/ var / lib / openshift / 5d5 / app-root / runtime / repo / wsgi / application,第21行,< module>
application = get_wsgi_application()
文件/var/lib/openshift/5d5/python/virtenv/lib/python2.7/site-packages/Django-1.8.7-py2.7.egg/ django / core / wsgi.py,第14行,在get_wsgi_application
django.setup()
文件/var/lib/openshift/5d5/python/virtenv/lib/python2.7/site- package / Django-1.8.7-py2.7.egg / django / __ init__.py,第17行,设置
configure_logging(settings.LOGGING_CONFIG,settings.LOGGING)
文件/ var / lib /openshift/5d5/python/virtenv/lib/python2.7/site-packages/Django-1.8.7-py2.7.egg/django/conf/__init__.py,第48行,__getattr__
自我._setup(name)
文件/var/lib/openshift/5d5/python/virtenv/lib/python2.7/site-packages/Django-1.8.7-py2.7.egg/django/conf/ __init__.py,第44行,_setup
self._wrapped =设置(settings_module)
文件/var/lib/openshift/5d5/python/virtenv/lib/python2.7/site-packages /Django-1.8.7-py2.7.egg/django/conf/__init__.py,第92行,__init__
mod = importlib。 import_module(self.SETTINGS_MODULE)
文件/opt/rh/python27/root/usr/lib64/python2.7/importlib/__init__.py,第37行,import_module
__import __(name)
文件/var/lib/openshift/5d5/app-root/runtime/repo/wsgi/bet/controller/settings.py,第59行,< module>
url = urlparse.urlparse(os.environ.get('OPENSHIFT_POSTGRESQL_DB_URL'))
文件/opt/rh/python27/root/usr/lib64/python2.7/urlparse.py,行143,in urlparse
tuple = urlsplit(url,scheme,allow_fragments)
文件/opt/rh/python27/root/usr/lib64/python2.7/urlparse.py,第182行, urlsplit
i = url.find(':')
AttributeError:'NoneType'对象没有属性'find'
这是我在以下工作的settings.py中使用该变量的方式:
import urlparse
DATABASES = {}
如果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.hostnam e,
'PORT':url.port,
}
是我的应用程序
文件:
#!/ 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))
除了:
从django.core.wsgi导入
import get_wsgi_application
application = get_wsgi_application()
如果我通过 rhc ssh bet
登录到我的应用程序,并尝试打印变量,它可以正常工作:
echo $ OPENSHIFT_POSTGRESQL_DB_URL
p $ p>
postgresql:// admin:password-mynick.rhcloud.com:port /
还有想法,我错过了什么。我没有运气,看看 here 。
注意:我的应用程序名为
bet
。但是,由于我将其移动到可伸缩的应用程序,我在openshift中创建了abet
应用程序。在wsgi
文件夹中,我将应用名称保存为bet
。可能会导致一些问题?解决方案嗯,看起来像某种 bug in OpenShift 。我试图重新启动/重新加载应用程序,没有运气。
$ rhc app stop -a appname
$ rhc app start -a appname
停止并启动应用程序使其正常工作。 (重载环境变量)
I am having problems running Django(1.8.7) app on scalable OpenShift platform using python 2.7. For some reason it can not get info of enviroment variable
OPENSHIFT_POSTGRESQL_DB_URL
. Well this is the error: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'
This is how I used that variable in settings.py that worked before:
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, }
and this is my
application
file:#!/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()
If I login to my app through
rhc ssh bet
and try to print variable, it works ok:echo $OPENSHIFT_POSTGRESQL_DB_URL postgresql://admin:password-mynick.rhcloud.com:port/
And idea what am I missing. I look here with no luck.
NOTE: My app is named
bet
. But since I am moving it to scalable app, I createdabet
app in openshift. I kept name of app asbet
inwsgi
folder. Might this cause some problems?解决方案Well, looks like some kind of bug in OpenShift. I tried to restart/reload app, no luck.
$ rhc app stop -a appname $ rhc app start -a appname
Stopping and starting app made it work. (Reloaded environment variables)
这篇关于在OpenShift可扩展应用程序上运行Django 1.8的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!