2016-10-05 9 views
1

Я пытаюсь расширить django-allauth, чтобы сделать что-то конкретное для моих проектов. Я в основном пытаюсь написать свою собственную оболочку поверх django-allauth и хочу, чтобы установка, конфигурация и другие материалы были очень похожими на allauth.Что такое метаклассовые базы в Python?

Для этого я начал с расширения AppSettings класса от allauth/accounts/app_settings.py. Я создал свой собственный app_settings.py сделал что-то вроде этого:

from allauth.account import app_settings as AllAuthAppSettings 
class MyAppSettings (AllAuthAppSettings): 
    def __init__(self, prefix): 
     # do something 

Кроме того, в конце app_settings.py, я просто поместить следующее (скопировав его из самого Джанго-allauth):

import sys 
my_app_settings = MyAppSettings('MY_PREFIX_') 
my_app_settings.__name__ = __name__ 
sys.modules[__name__] = my_app_settings 

Теперь, когда я начинаю свой проект, он дает мне следующую ошибку:

TypeError: Error when calling the metaclass bases 
    __init__() takes exactly 2 arguments (4 given) 

Честно говоря, я совсем новичок в мир Python-Django и на самом деле не понимаю, что происходит в этом последнем фо ур.

Что такое Основания метакласса? Каковы четыре аргумента, которые передаются ему? Как мне заставить этот поток работать?

Вот трассировки стека:

Unhandled exception in thread started by <function wrapper at 0x104146578> 
Traceback (most recent call last): 
    File "/Users/user/anaconda/lib/python2.7/site-packages/django/utils/autoreload.py", line 226, in wrapper 
    fn(*args, **kwargs) 
    File "/Users/user/anaconda/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 109, in inner_run 
    autoreload.raise_last_exception() 
    File "/Users/user/anaconda/lib/python2.7/site-packages/django/utils/autoreload.py", line 249, in raise_last_exception 
    six.reraise(*_exception) 
    File "/Users/user/anaconda/lib/python2.7/site-packages/django/utils/autoreload.py", line 226, in wrapper 
    fn(*args, **kwargs) 
    File "/Users/user/anaconda/lib/python2.7/site-packages/django/__init__.py", line 18, in setup 
    apps.populate(settings.INSTALLED_APPS) 
    File "/Users/user/anaconda/lib/python2.7/site-packages/django/apps/registry.py", line 108, in populate 
    app_config.import_models(all_models) 
    File "/Users/user/anaconda/lib/python2.7/site-packages/django/apps/config.py", line 202, in import_models 
    self.models_module = import_module(models_module_name) 
    File "/Users/user/anaconda/lib/python2.7/importlib/__init__.py", line 37, in import_module 
    __import__(name) 
    File "/Users/user/myproject/my_app/models.py", line 18, in <module> 
    from .model_managers import * 
    File "/Users/user/myproject/my_app/model_managers.py", line 89, in <module> 
    from . import app_settings 
    File "/Users/user/myproject/my_app/app_settings.py", line 9, in <module> 
TypeError: Error when calling the metaclass bases 
    __init__() takes exactly 2 arguments (4 given) 

ответ

1

Это не выглядит, как вы должны быть в состоянии наследовать от AllAuthAppSettings

Пакет django-allauth делает некоторые очень некрасиво питона волшебную

import sys # noqa 
app_settings = AppSettings('ACCOUNT_') 
app_settings.__name__ = __name__ 
sys.modules[__name__] = app_settings 

В основном, когда вы импортируете модуль app_settings, он создает экземпляр класса AppSettings, r переименовывает его в имя модуля app_settings, а затем заменяет импортированный модуль экземпляром класса!

Вы не можете наследовать экземпляры классов. Я предполагаю, что вы хотите наследовать от этого не-созданного класса AppSettings. Чтобы сделать это, вы должны наследовать от class из app_settings, не app_settings непосредственно

from allauth.account import app_settings as AllAuthAppSettings 


class MyAppSettings(AllAuthAppSettings.__class__): 
    ... 

Я не думаю, что вы должны должны скопировать эти строки из конца app_settings модуля взломать ваш модуль в классе ,

+0

благодарит за ответ! Я получил информацию о том, почему это хакерский путь. Тем не менее, я все равно получаю ту же ошибку при выполнении вышеуказанных изменений. Есть ли способ получить неподтвержденный класс AppSettings в моем пользовательском app_settings.py? – pymd

+0

Вы уверены, что ошибка исходит от этого класса? У вас есть полная трассировка –

+0

Думаю, что да. Я добавил полную трассировку стека. – pymd