下载openstack f3 版本的Dashboard.启动报错,主要是django.conf.Settings 没有OPENSTACK_KEYSTONE_URL属性,不行那就调试看看吧。python
/home/xuegang/horizon-2012.2/tools/with_venv.sh python -m pdb /home/xuegang/horizon-2012.2/manage.py runserverdjango
跟踪代码到:app
(Pdb) c
> /home/xuegang/horizon-2012.2/.venv/lib/python2.6/site-packages/django/utils/functional.py(183)inner()
-> if self._wrapped is empty:
(Pdb) list
179
180 empty = object()
181 def new_method_proxy(func):
182 def inner(self, *args):
183 B if self._wrapped is empty:
184 B-> self._setup()
185 B return func(self._wrapped, *args)
186 return inner
187
188 class LazyObject(object):
189 """ssh
进入184行的函数:
(Pdb) s
--Call--
> /home/xuegang/horizon-2012.2/.venv/lib/python2.6/site-packages/django/conf/__init__.py(27)_setup()
-> def _setup(self):
(Pdb) list
22 """
23 A lazy proxy for either global Django settings or a custom settings object.
24 The user can manually configure settings prior to using them. Otherwise,
25 Django uses the settings module pointed to by DJANGO_SETTINGS_MODULE.
26 """
27 -> def _setup(self):
28 """
29 Load the settings module pointed to by the environment variable. This
30 is used the first time we need any settings at all, if the user has not
31 previously configured the settings manually.
32 函数
---------------继续跟进oop
(Pdb) n
> /home/xuegang/horizon-2012.2/.venv/lib/python2.6/site-packages/django/conf/__init__.py(42)_setup()
-> self._wrapped = Settings(settings_module)
(Pdb) list
37 except KeyError:
38 # NOTE: This is arguably an EnvironmentError, but that causes
39 # problems with Python's interactive help.
40 raise ImportError("Settings cannot be imported, because environment variable %s is undefined." % ENVIRONMENT_VARIABLE)
41
42 -> self._wrapped = Settings(settings_module)
43
44 def configure(self, default_settings=global_settings, **options):
45 """
46 Called to manually configure the settings. The 'default_settings'
47 parameter sets where to retrieve any unspecified values from (its
(Pdb) pp settings_module
'openstack_dashboard.settings'测试
42行开始构造Settings 对象,继续进入:
(Pdb) s
--Call--
> /home/xuegang/horizon-2012.2/.venv/lib/python2.6/site-packages/django/conf/__init__.py(83)__init__()
-> def __init__(self, settings_module):
(Pdb) list
78 "to a tuple, not a string.")
79 object.__setattr__(self, name, value)
80
81
82 class Settings(BaseSettings):
83 -> def __init__(self, settings_module):
84 # update this dict from global settings (but only for ALL_CAPS settings)
85 for setting in dir(global_settings):
86 if setting == setting.upper():
87 setattr(self, setting, getattr(global_settings, setting))
88
(Pdb) 这几句代码直接是吧global_settings 大写的属性和值往Self里面塞 ,打印出来看看
(Pdb) pp global_settings
<module 'django.conf.global_settings' from '/home/xuegang/horizon-2012.2/.venv/lib/python2.6/site-packages/django/conf/global_settings.pyc'>
(Pdb) dir(global_settings)
['ABSOLUTE_URL_OVERRIDES', 'ADMINS', 'ADMIN_FOR', 'ALLOWED_INCLUDE_ROOTS', 'APPEND_SLASH', 'AUTHENTICATION_BACKENDS', 'CACHES', 'CACHE_MIDDLEWARE_ALIAS', 'CACHE_MIDDLEWARE_KEY_PREFIX', 'CACHE_MIDDLEWARE_SECONDS', 'COMMENTS_ALLOW_PROFANITIES', 'CSRF_COOKIE_DOMAIN', 'CSRF_COOKIE_NAME', 'CSRF_COOKIE_PATH', 'CSRF_COOKIE_SECURE', 'CSRF_FAILURE_VIEW', 'DATABASES', 'DATABASE_ROUTERS', 'DATETIME_FORMAT', 'DATETIME_INPUT_FORMATS', 'DATE_FORMAT', 'DATE_INPUT_FORMATS', 'DEBUG', 'DEBUG_PROPAGATE_EXCEPTIONS', 'DECIMAL_SEPARATOR', 'DEFAULT_CHARSET', 'DEFAULT_CONTENT_TYPE', 'DEFAULT_EXCEPTION_REPORTER_FILTER', 'DEFAULT_FILE_STORAGE', 'DEFAULT_FROM_EMAIL', 'DEFAULT_INDEX_TABLESPACE', 'DEFAULT_TABLESPACE', 'DISALLOWED_USER_AGENTS', 'EMAIL_BACKEND', 'EMAIL_HOST', 'EMAIL_HOST_PASSWORD', 'EMAIL_HOST_USER', 'EMAIL_PORT', 'EMAIL_SUBJECT_PREFIX', 'EMAIL_USE_TLS', 'FILE_CHARSET', 'FILE_UPLOAD_HANDLERS', 'FILE_UPLOAD_MAX_MEMORY_SIZE', 'FILE_UPLOAD_PERMISSIONS', 'FILE_UPLOAD_TEMP_DIR', 'FIRST_DAY_OF_WEEK', 'FIXTURE_DIRS', 'FORCE_SCRIPT_NAME', 'FORMAT_MODULE_PATH', 'IGNORABLE_404_URLS', 'INSTALLED_APPS', 'INTERNAL_IPS', 'LANGUAGES', 'LANGUAGES_BIDI', 'LANGUAGE_CODE', 'LANGUAGE_COOKIE_NAME', 'LOCALE_PATHS', 'LOGGING', 'LOGGING_CONFIG', 'LOGIN_REDIRECT_URL', 'LOGIN_URL', 'LOGOUT_URL', 'MANAGERS', 'MEDIA_ROOT', 'MEDIA_URL', 'MESSAGE_STORAGE', 'MIDDLEWARE_CLASSES', 'MONTH_DAY_FORMAT', 'NUMBER_GROUPING', ,'PASSWORD_HASHERS', 'PASSWORD_RESET_TIMEOUT_DAYS', 'PREPEND_WWW', 'PROFANITIES_LIST', 'SECRET_KEY', 'SECURE_PROXY_SSL_HEADER', 'SEND_BROKEN_LINK_EMAILS', 'SERVER_EMAIL', 'SESSION_COOKIE_AGE', 'SESSION_COOKIE_DOMAIN', 'SESSION_COOKIE_HTTPONLY', 'SESSION_COOKIE_NAME', 'SESSION_COOKIE_PATH', 'SESSION_COOKIE_SECURE', 'SESSION_ENGINE', 'SESSION_EXPIRE_AT_BROWSER_CLOSE', 'SESSION_FILE_PATH', 'SESSION_SAVE_EVERY_REQUEST', 'SHORT_DATETIME_FORMAT', 'SHORT_DATE_FORMAT', 'SIGNING_BACKEND', 'STATICFILES_DIRS', 'STATICFILES_FINDERS', 'STATICFILES_STORAGE', 'STATIC_ROOT', 'STATIC_URL', 'TEMPLATE_CONTEXT_PROCESSORS', 'TEMPLATE_DEBUG', 'TEMPLATE_DIRS', 'TEMPLATE_LOADERS', 'TEMPLATE_STRING_IF_INVALID', 'TEST_RUNNER', 'THOUSAND_SEPARATOR', 'TIME_FORMAT', 'TIME_INPUT_FORMATS', 'TIME_ZONE', 'TRANSACTIONS_MANAGED', 'URL_VALIDATOR_USER_AGENT', 'USE_ETAGS', 'USE_I18N', 'USE_L10N', 'USE_THOUSAND_SEPARATOR', 'USE_TZ', 'USE_X_FORWARDED_HOST', 'WSGI_APPLICATION', 'X_FRAME_OPTIONS', 'YEAR_MONTH_FORMAT', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'get_version', 'gettext_noop']
(Pdb) ui
这里已经很明白了,在 /home/xuegang/horizon-2012.2/.venv/lib/python2.6/site-packages/django/conf/global_settings.py 没有OPENSTACK_KEYSTONE_URL属性,那就添加上去。this
----------------------------------------------继续看看测试状况。spa
(Pdb) list
82 class Settings(BaseSettings):
83 def __init__(self, settings_module):
84 # update this dict from global settings (but only for ALL_CAPS settings)
85 for setting in dir(global_settings):
86 if setting == setting.upper():
87 -> setattr(self, setting, getattr(global_settings, setting))
88
89 # store the settings module in case someone later cares
90 self.SETTINGS_MODULE = settings_module
91
92 try:
(Pdb) n
> /home/xuegang/horizon-2012.2/.venv/lib/python2.6/site-packages/django/conf/__init__.py(85)__init__()
-> for setting in dir(global_settings):
(Pdb) dir(self)
['ABSOLUTE_URL_OVERRIDES', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
(Pdb) self
<django.conf.Settings object at 0x13fe650>
(Pdb)
这里也证明了上面的结论。
Python代码一步一步调试,多打印,总可以发现问题所在,增长研究地信心。