下載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代碼一步一步調試,多打印,總可以發現問題所在,增長研究地信心。