TypeError: __init__() 得到了一个意外的关键字参数 'providing_args'

新手上路,请多包涵

我正在创建一个 Django 网站。我最近使用 allauth 包添加了权限/搜索功能。当我尝试通过 docker 运行网站时,我收到错误消息:

_文件“/usr/local/lib/python3.9/site-packages/allauth/account/signals.py”,第 5 行,在 user_logged_in = Signal(providing_args=[“request”, “user”]) TypeError: init ( ) 得到了一个意外的关键字参数 ‘providing_args’_

是什么导致了这个错误?我知道通常类型错误是由不正确的 models.py 文件引起的,但我似乎无法访问该文件,因为它是外部包的一部分。

网址.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

模型.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

完整回溯:

 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'

原文由 huntere2501 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.5k
2 个回答

根据评论,您正在使用旧版本的 AllAuth 运行 Django 4.0。所以你只需要更新 AllAuth 就可以了。


但是,其他 已升级 AllAuth运行 Django 4.0仍然 看到此错误的人可能注册了自定义 AllAuth 或其他信号,其中包括 providing_args 参数。

在这种情况下,您需要在项目中搜索任何信号(例如那些在 AllAuth 中经常被覆盖的信号: user_logged_inemail_changed )并删除 providing_args=['request', 'user', 'signup'] 来自 Signal 括号的变体。

有关更多信息,请参见下文,以及一个示例差异,显示如何将每个 providing_args 参数移动到注释行。


Django 弃用了在 Django 3.1 中使用 providing_args 参数到 django.dispatch.Signal 的能力。请参阅 3.1 发行说明的 杂项部分 中的项目符号。

它被删除是因为这个参数除了作为文档之外没有做任何事情。如果这看起来很奇怪,那是因为它很奇怪。参数应指示数据已通过。这可能就是它被弃用的原因。

Django 4.0 继续并完全删除了它,使调用 Signal()providing_args 参数的任何代码现在触发您遇到的 TypeError:

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

AllAuth 于 2020 年 9 月删除了此参数的使用。(请在此处查看有关此问题的 原始报告引用的差异

在此线程中提问的人正在运行 AllAuth 0.42.0 不包括此更改,因此与 Django 4.0 不兼容。

截至今天,Django AllAuth 的最新版本 0.42.0 Django 3.2.9 兼容。

原文由 Rob 发布,翻译遵循 CC BY-SA 4.0 许可协议

我通过更换解决了同样的问题

check_request_enabled = Signal(providing_args=["request"])

check_request_enabled = Signal("request")

现在它工作得很好。

原文由 Nishith Shetty 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题