2

設定ファイルで 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.LazyObjectdelattr

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 回しか表示されないことに注意してください。

4

1 に答える 1

1

これは既知の Django の問題で、最新のマスター (1.5dev) https://code.djangoproject.com/ticket/17966で修正されています。

于 2012-09-19T19:33:45.250 に答える