【问题标题】:Django signals not receiving/workingDjango 信号未接收/工作
【发布时间】:2017-08-24 10:41:12
【问题描述】:

我正在使用 django 默认接收器来处理信号。但它不工作。 当新的用户对象在 APP2 中创建接收器 signal.py 正在收听它时,我已经修改了 APP1 中的用户模型,但它不起作用。

app1/model.py

class User(BaseModel, AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )
    username = models.CharField(max_length=40, unique=True)
    first_name = models.CharField(max_length=30, blank=True, null=True)
    last_name = models.CharField(max_length=30, blank=True, null=True)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    is_email_verified = models.BooleanField(default=False)
    is_paid = models.IntegerField(default=0)
    access_token = models.CharField(max_length=128, blank=True) 

    objects = UserManager() 

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']  

    class Meta:
        db_table = 'users'  

    def __str__(self):
        return self.email

app2/signals.py

from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
from accounts.models import User    

@receiver(post_save, sender=User)#settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
    print ("token generated")
    if created:
       print("data at signal ****", instance.email, instance)

【问题讨论】:

  • @brunodesthuilliers 通过管理员创建用户
  • 呃?您确定您创建的用户是 account.models.User 实例,而不是 django.contrib.auth.models.User 实例吗?另外,你确定app2.signals是在启动时导入的吗?
  • @brunodesthuilliers app2.signals is not importd in startup 如何在 django 1.10 中执行此操作
  • @brunodesthuilliers 如何在启动时导入它

标签: python django django-rest-framework


【解决方案1】:

我终于得到了答案。这是因为我没有在启动时导入 signals.py

工作代码

apps.py

​​>
from __future__ import unicode_literals

from django.apps import AppConfig


class StreamsConfig(AppConfig):
    name = 'streams'    

    def ready(self):
        print("at ready")
        import streams.signals

初始化.py

​​>
default_app_config = 'streams.apps.StreamsConfig'

在此更改之后,我收到了信号

更新:

根据新应用程序的 django 3.0 文档,如果您使用虚线路径进行应用程序配置,则不需要在 init.py 中添加 default_app_config。 https://docs.djangoproject.com/en/3.0/ref/applications/#django.apps.AppConfig.ready

只需替换

INSTALLED_APPS = (
 ...,
 'streams',
)

INSTALLED_APPS = (
 ...,
 'streams.apps.StreamsConfig',
)

它会起作用的。

【讨论】:

  • 记住添加default_app_config = 'streams.apps.StreamsConfig'非常重要
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-06
  • 1970-01-01
  • 2017-02-06
  • 2019-01-08
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多