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