TypeError: __init__() получил неожиданный аргумент ключевого слова 'providing_args'

Я создаю сайт на Django. Недавно я добавил функциональность разрешений/поиска, используя пакет allauth. Когда я пытаюсь запустить сайт через docker, я получаю сообщение об ошибке:

Файл "/usr/local/lib/python3.9/site-packages/allauth/account/signals.py", строка 5, in user_logged_in = Signal(providing_args=["request", "user"]) TypeError: init() получил неожиданный аргумент ключевого слова 'providing_args'

Что вызывает эту ошибку? Я знаю, что обычно ошибка типа вызывается неправильными файлами models.py, но я не могу получить доступ к этому файлу, поскольку он является частью внешнего пакета.

Urls.py

urlpatterns = [
    path('admin/', admin.site.urls),

    path('accounts/', include('allauth.urls')),

    path('accounts/', include('accounts.urls')),
    
    path('', include('climate.urls')),
    
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

if settings.DEBUG:
    import debug_toolbar
    urlpatterns = [
        path('__debug__/', include(debug_toolbar.urls)),
    ] + urlpatterns

Models.py

class Country(models.Model):
    id = models.UUIDField(
        primary_key= True,
        db_index = True,
        default=uuid.uuid4,
        editable= False
    )
    name = models.CharField(max_length=50)
    population = models.IntegerField(default=1)
    emissions = models.FloatField(default=1)
    reason = models.CharField(default="", max_length=100)
    flags = models.ImageField(upload_to='images/', default="")
    page = models.URLField(max_length=300, default="")

    def save(self, *args, **kwargs):
        super(Country, self).save(*args, **kwargs)

    class Meta:
        verbose_name_plural = 'countries'
        indexes = [
            models.Index(fields=['id'], name='id_index')
        ]
        permissions = {
            ("special_status", "Can read all countries")
        }

    def __str__(self):
        return self.name

    def flag(self):
        return u'<img src="%s" />' % (self.flags.url)

    def get_absolute_url(self):
        return reverse('country_detail', args =[str(self.id)])

    flag.short_description = 'Flag'

Мой settings.py, который обрабатывает allauth.

AUTH_USER_MODEL = 'accounts.CustomUser'
LOGIN_REDIRECT_URL = 'climate:home'
ACCOUNT_LOGOUT_REDIRECT = 'climate:home'
ACCOUNT_SESSION_REMEMBER = True
ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE = False
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_UNIQUE_EMAIL = True

Full Traceback:

Traceback (most recent call last):

  File "/usr/local/lib/python3.9/threading.py", line 954, in _bootstrap_inner

    self.run()

  File "/usr/local/lib/python3.9/threading.py", line 892, in run

    self._target(*self._args, **self._kwargs)

  File "/usr/local/lib/python3.9/site-packages/django/utils/autoreload.py", line 64, in wrapper

    fn(*args, **kwargs)

  File "/usr/local/lib/python3.9/site-packages/django/core/management/commands/runserver.py", line 115, in inner_run

    autoreload.raise_last_exception()

  File "/usr/local/lib/python3.9/site-packages/django/utils/autoreload.py", line 87, in raise_last_exception

    raise _exception[1]

  File "/usr/local/lib/python3.9/site-packages/django/core/management/__init__.py", line 381, in execute

    autoreload.check_errors(django.setup)()

  File "/usr/local/lib/python3.9/site-packages/django/utils/autoreload.py", line 64, in wrapper

    fn(*args, **kwargs)

  File "/usr/local/lib/python3.9/site-packages/django/__init__.py", line 24, in setup

    apps.populate(settings.INSTALLED_APPS)

  File "/usr/local/lib/python3.9/site-packages/django/apps/registry.py", line 114, in populate

    app_config.import_models()

  File "/usr/local/lib/python3.9/site-packages/django/apps/config.py", line 300, in import_models

    self.models_module = import_module(models_module_name)

  File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module

    return _bootstrap._gcd_import(name[level:], package, level)

  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import

  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load

  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked

  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked

  File "<frozen importlib._bootstrap_external>", line 790, in exec_module

  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed

  File "/usr/local/lib/python3.9/site-packages/allauth/account/models.py", line 12, in <module>

    from . import app_settings, signals

  File "/usr/local/lib/python3.9/site-packages/allauth/account/signals.py", line 5, in <module>

    user_logged_in = Signal(providing_args=["request", "user"])

TypeError: __init__() got an unexpected keyword argument 'providing_args'

Судя по комментариям, вы используете Django 4.0 со старой версией AllAuth. Поэтому вам просто нужно обновить AllAuth и все будет в порядке.


Однако, другие люди, которые обновили AllAuth и работают с Django 4.0, но все еще видят эту ошибку, могут иметь зарегистрированные пользовательские AllAuth или другие сигналы, которые включают аргумент providing_args.

В этом случае вам нужно поискать в проекте сигналы (например, те, которые часто переопределяются в AllAuth: user_logged_in или email_changed) и удалить providing_args=['request', 'user', 'signup'] или другой вариант из скобки Signal.

Для получения дополнительной информации см. ниже, а также пример diff, показывающий, как можно переместить каждый аргумент providing_args в закомментированную строку.


В Django 3.1 утрачена возможность использования аргумента providing_args в django.dispatch.Signal. Смотрите сообщение в разделе Misc в примечаниях к релизу 3.1.

Он был удален, потому что этот аргумент не делает ничего, кроме как выполняет роль документации. Если это кажется странным, то это потому, что это странно. Аргументы должны указывать на передаваемые данные. Вероятно, поэтому он был устаревшим.

Django 4.0 пошел дальше и полностью убрал это, заставив любой код, который вызывает Signal() с аргументом providing_args, теперь вызывает TypeError, с которым вы столкнулись:

TypeError: Signal.__init__() got an unexpected keyword argument 'providing_args'

AllAuth удалил использование этого аргумента в сентябре 2020 года. (См. первоначальный отчет по этому вопросу здесь и ссылку diff)

Человек, задавший вопрос в этой теме, использовал AllAuth 0.42.0, который не включает это изменение и поэтому несовместим с Django 4.0.

По состоянию на сегодня, последняя версия Django AllAuth 0.42.0 совместима с Django 3.2.9.

Я не знаю, почему это происходит, но (это работает на моей машине) я решил ту же проблему, заменив

user_logged_in = Signal(providing_args=["request", "user"])

с

user_logged_in = Signal()

в /usr/local/lib/python3.9/site-packages/allauth/account/signals.py

Вернуться на верх