django TypeError:__init__()获取了意外的关键字参数“providing_args”

5f0d552i  于 2023-11-20  发布在  Go
关注(0)|答案(8)|浏览(202)

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

  • File“/usr/local/lib/python3.9/site-packages/allauth/account/signals.py“,line 5,in user_logged_in = Signal(providing_args=[“request”,“user”])TypeError:init()got an unexpected keyword argument 'providing_args'*

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

url.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


完整追溯:

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'

ncecgwcz

ncecgwcz1#

根据评论,您正在使用旧版本的AllAuth运行Django 4.0。所以您只需要更新AllAuth,应该没问题。
然而,其他已经升级AllAuth正在运行Django 4.0但 * 仍然 * 看到此错误的人可能已经注册了自定义AllAuth或其他包含providing_args参数的信号。
在这种情况下,您需要搜索项目中的任何信号(例如AllAuth中经常覆盖的信号:user_logged_inemail_changed),并从Signal括号中删除providing_args=['request', 'user', 'signup']或其他变体。
更多信息请参见下文,以及一个展示如何将每个providing_args参数移动到注解行的差异示例。
Django在Django 3.1中不推荐使用providing_args参数到django.dispatch.Signal。请参阅3.1发行说明的杂项部分中的项目符号。
它被删除是因为这个参数除了充当文档之外没有做任何事情。如果这看起来很奇怪,那是因为它很奇怪。参数应该指示正在传递的数据。这可能是它被弃用的原因。
Django 4.0继续前进并完全删除了这一点,使任何使用providing_args参数调用Signal()的代码现在都会触发您遇到的TypeError:
TypeError: Signal.__init__() got an unexpected keyword argument 'providing_args'
AllAuth在2020年9月删除了此参数的使用。(请参阅original reportreferenced diff
在这个帖子中提出问题的人正在运行AllAuth 0.42.0,它不包括此更改,因此与Django 4.0不兼容。
截至目前,Django AllAuth 0.42.0 * 的最后一个版本与Django 3.2.9兼容。

3ks5zfa0

3ks5zfa02#

我解决了同样的问题,

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

字符串

check_request_enabled = Signal("request")


现在它工作得很好。

qvtsj1bj

qvtsj1bj3#

这适用于在Django 4.0上遇到相同问题且未使用AllAuth的任何人。
我遇到了类似的问题。然而,我没有使用AllAuth。问题是Django 4.0没有任何providing_args参数,所以信号是这样声明的。

from django.dispatch import Signal

model_delete_signal = Signal()

字符串
现在,您可以在发送信号时发送任何参数,该信号将在接收器中的kwargs中接收。
例如,在自定义删除函数中发送信号时,我发送了以下instance参数

model_delete_signal.send(sender='session_delete', instance=self)


并以这种方式将其接收到接收器中

@receiver(session_delete)
def delete_session(sender, **kwargs):
    instance = kwargs['instance']


请注意,对于任何在Singal()中没有providing_args参数的Django版本,解决方案都是相同的

a2mppw5e

a2mppw5e4#

我不知道为什么会发生这种情况,但(它在我的机器上工作)我解决了同样的问题,

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

字符串

user_logged_in = Signal()


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

carvr3hs

carvr3hs5#

在Django 4的新版本中,你可以使用Signal而不带参数。

from django.dispatch import Signal, receiver
notification=Signal()
@receiver(notification)
def show_notification(sender, **kwargs):
    print("sender,", sender)
    print("Kwargs", kwargs)
    print("Notification")

字符串
在使用Signal之后,像这样写

notification.send(sender=None, request=request, user=['Sakib', 'Malik'])

ldioqlga

ldioqlga6#

对于这个问题有更好的解释,但这对我来说是有效的。
关于Django
不推荐使用Signal的纯文档性providing_args参数。如果您依赖此参数作为文档,则可以将文本移动到代码注解或文档字符串中。
只需注解掉本地项目存储中signals.py文件中的以下代码:

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

# Typically followed by `user_logged_in` (unless, e-mail verification kicks in)
user_signed_up = Signal(providing_args=["request", "user"])

password_set = Signal(providing_args=["request", "user"])
password_changed = Signal(providing_args=["request", "user"])
password_reset = Signal(providing_args=["request", "user"])

email_confirmed = Signal(providing_args=["request", "email_address"])
email_confirmation_sent = Signal(
    providing_args=["request", "confirmation", "signup"])

email_changed = Signal(
    providing_args=[
        "request", "user",
        "from_email_address", "to_email_address"])
email_added = Signal(providing_args=["request", "user", "email_address"])
email_removed = Signal(providing_args=["request", "user", "email_address"])

字符串
您可以在/usr/local/lib/python3.10/site-packages/allauth/account/signals.py中找到它

svdrlsy4

svdrlsy47#

来自django 3.1的django文档:
不推荐使用Signal的纯文档性providing_args参数。如果您依赖此参数作为文档,则可以将文本移动到代码注解或文档字符串中。

tvz2xvvm

tvz2xvvm8#

首先检查你的signals.py文件,在那里你使用Signal()函数

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

字符串
Signal()函数中,不要给予providing_args作为参数,给予参数,如

SignalName = Signal(["request", "user"])

相关问题