設定ファイルで AUTH_PROFILE_MODULE を次のように設定しています。
AUTH_PROFILE_MODULE = 'api.AccountProfile'
そして、API アプリは次のようにインストール済みアプリに追加されます。
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
#3rd party apps
'south',
'allauth',
'allauth.account',
'allauth.socialaccount',
'allauth.socialaccount.providers.facebook',
'allauth.socialaccount.providers.twitter',
#Our apps
'ourproject.apps.api',
# Uncomment the next line to enable the admin:
# 'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
)
問題なく実行./manage.py syncdb
し./manage.py migrate
、次に django 単体テストを実行し./manage.py test
ます。失敗する最初のテストは、 にある AUTH_PROFILE_MODULE テストですdjango.contrib.auth.tests.models.ProfileTestCase
。
この特定のテストは、最初は失敗します。
def test_site_profile_not_available(self):
# calling get_profile without AUTH_PROFILE_MODULE set
if hasattr(settings, 'AUTH_PROFILE_MODULE'):
del settings.AUTH_PROFILE_MODULE #<----Fails here
さらにスタックを下ると、最終的にラッパーで呼び出されるwhenの__delattr__
メソッドでエラーが発生していることがわかります。django.utils.functional.LazyObject
delattr
def __delattr__(self, name):
if name == "_wrapped":
raise TypeError("can't delete _wrapped.")
if self._wrapped is empty:
self._setup()
delattr(self._wrapped, name) #<----Fails here
そして、ここにトレースバックがあります:
File "/path/to/python/files/django/contrib/auth/tests/models.py", line 30, in test_site_profile_not_available
del settings.AUTH_PROFILE_MODULE
File "/path/to/python/files/django/utils/functional.py", line 211, in __delattr__
delattr(self._wrapped, name)
AttributeError: 'UserSettingsHolder' object has no attribute 'AUTH_PROFILE_MODULE'
そこで、django のソースを掘り下げ、いくつかの print ステートメントを追加して、何が起こっているのかを確認しました。
django.contrib.auth.tests.models.ProfileTestCase:
def test_site_profile_not_available(self):
# calling get_profile without AUTH_PROFILE_MODULE set
if hasattr(settings, 'AUTH_PROFILE_MODULE'):
print '*******', type(settings), '********'
del settings.AUTH_PROFILE_MODULE
Output: ******* <class 'django.conf.LazySettings'> ********
django.utils.functional.LazyObject:
def __delattr__(self, name):
if name == "_wrapped":
raise TypeError("can't delete _wrapped.")
if self._wrapped is empty:
print 'Here I am. Rock you like a hurricane'
self._setup()
print '*************', hasattr(self._wrapped, name)
print '*************', name
print '*************', self._wrapped.AUTH_PROFILE_MODULE
delattr(self._wrapped, name)
Output: ************* True
************* AUTH_PROFILE_MODULE
************* api.AccountProfile
LazySettings
から継承し、独自のdelattrLazyObject
メソッドを持たないことに注意してください。
https://dl.dropbox.com/u/20560722/TestOutput.txtの完全な出力は./manage.py test
次のとおりです。問題のテストは 1 回だけ実行され、print ステートメントは 1 回しか表示されないことに注意してください。