Python Django信号:如何初始化绑定?

Python Django信号:如何初始化绑定?,python,django,Python,Django,我正在导入应用程序的\uuuu init\uuuu.py文件中的信号文件。当我运行manage.py runserver时,发现\uuuu init\uuuu.py被导入了两次,我的回调运行了两次 但是,当我运行manage.py shell时,\uuuuu init\uuuuu.py按预期工作(一次) (Django 1.8.3) app/\uuuuu init\uuuuuuuuuuuuupy: print 'Hello!' import signals print 'Hello!' imp

我正在导入应用程序的
\uuuu init\uuuu.py
文件中的信号文件。当我运行manage.py runserver时,发现
\uuuu init\uuuu.py
被导入了两次,我的回调运行了两次

但是,当我运行manage.py shell时,
\uuuuu init\uuuuu.py
按预期工作(一次)

(Django 1.8.3)

app/\uuuuu init\uuuuuuuuuuuuupy

print 'Hello!'
import signals
print 'Hello!'
import app.signals
app/models.py:

from django.db import models

class RemoteTask(models.Model):
    title = models.CharField(max_length=50)

class RemoteTaskStatus(models.Model):
    remote_task = models.IntegerField()
    status = models.IntegerField()
app/signals.py:

print '------> app/signals.py'

from django.db.models.signals import post_save
from django.dispatch import receiver
from app.models import RemoteTask, RemoteTaskStatus

@receiver(post_save, sender=RemoteTask)
def status_new(sender, **kwargs):
    print '---------> Running callback'
    if kwargs.get('created', 'False') is True:
        instance = kwargs['instance']
        RemoteTaskStatus.objects.create(
            remote_task=instance,
            status=0
        )
示例输出:

$ ./manage.py runserver
Hello!
------> app/signals.py
Hello!
------> app/signals.py
Performing system checks...

System check identified no issues (0 silenced).
August 12, 2015 - 19:50:38
Django version 1.8.3, using settings 'signal_loca.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Angel Velasquez提供的解决方案:
app/\uuuuu init\uuuuuuuuuuuuupy

print 'Hello!'
import signals
print 'Hello!'
import app.signals

AppConfig.ready
方法中导入
signals.py
,以防止回调被注册两次。以下是推荐的方法:

my_awesome_project/
|-- app/
|   |-- __init__.py   <-- set default_app_config here
|   |-- apps.py       <-- define your AppConfig subclass here
|   |-- models.py
|   |-- signals.py    <-- define your signal handling functions here
|-- other_app/
|-- my_awesome_project/
    |-- __init__.py
    |-- settings.py
    |-- wsgi.py
app/apps.py

default_app_config = 'app.apps.MyAppConfig'
from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name="app"

    def ready(self):
        from . import signals
from django.db import models

class RemoteTask(models.Model):
    title = models.CharField(max_length=50)

class RemoteTaskStatus(models.Model):
    remote_task = models.IntegerField()
    status = models.IntegerField()
from django.db.models.signals import post_save
from django.dispatch import receiver
from app.models import RemoteTask, RemoteTaskStatus

@receiver(post_save, sender=RemoteTask, dispatch_uid="status_new_signal_on_RemoteTask_post_save")
def status_new(sender, **kwargs):
    print '---------> Running callback'
    if kwargs.get('created', 'False') is True:
        instance = kwargs['instance']
        RemoteTaskStatus.objects.create(
            remote_task=instance,
            status=0
        )
apps/models.py

default_app_config = 'app.apps.MyAppConfig'
from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name="app"

    def ready(self):
        from . import signals
from django.db import models

class RemoteTask(models.Model):
    title = models.CharField(max_length=50)

class RemoteTaskStatus(models.Model):
    remote_task = models.IntegerField()
    status = models.IntegerField()
from django.db.models.signals import post_save
from django.dispatch import receiver
from app.models import RemoteTask, RemoteTaskStatus

@receiver(post_save, sender=RemoteTask, dispatch_uid="status_new_signal_on_RemoteTask_post_save")
def status_new(sender, **kwargs):
    print '---------> Running callback'
    if kwargs.get('created', 'False') is True:
        instance = kwargs['instance']
        RemoteTaskStatus.objects.create(
            remote_task=instance,
            status=0
        )
app/signals.py

default_app_config = 'app.apps.MyAppConfig'
from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name="app"

    def ready(self):
        from . import signals
from django.db import models

class RemoteTask(models.Model):
    title = models.CharField(max_length=50)

class RemoteTaskStatus(models.Model):
    remote_task = models.IntegerField()
    status = models.IntegerField()
from django.db.models.signals import post_save
from django.dispatch import receiver
from app.models import RemoteTask, RemoteTaskStatus

@receiver(post_save, sender=RemoteTask, dispatch_uid="status_new_signal_on_RemoteTask_post_save")
def status_new(sender, **kwargs):
    print '---------> Running callback'
    if kwargs.get('created', 'False') is True:
        instance = kwargs['instance']
        RemoteTaskStatus.objects.create(
            remote_task=instance,
            status=0
        )
编辑:


dispatch\u uid
添加到
receiver
decorator。

AppConfig.ready
方法中导入您的
signals.py
,以防止回调被注册两次。以下是推荐的方法:

my_awesome_project/
|-- app/
|   |-- __init__.py   <-- set default_app_config here
|   |-- apps.py       <-- define your AppConfig subclass here
|   |-- models.py
|   |-- signals.py    <-- define your signal handling functions here
|-- other_app/
|-- my_awesome_project/
    |-- __init__.py
    |-- settings.py
    |-- wsgi.py
app/apps.py

default_app_config = 'app.apps.MyAppConfig'
from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name="app"

    def ready(self):
        from . import signals
from django.db import models

class RemoteTask(models.Model):
    title = models.CharField(max_length=50)

class RemoteTaskStatus(models.Model):
    remote_task = models.IntegerField()
    status = models.IntegerField()
from django.db.models.signals import post_save
from django.dispatch import receiver
from app.models import RemoteTask, RemoteTaskStatus

@receiver(post_save, sender=RemoteTask, dispatch_uid="status_new_signal_on_RemoteTask_post_save")
def status_new(sender, **kwargs):
    print '---------> Running callback'
    if kwargs.get('created', 'False') is True:
        instance = kwargs['instance']
        RemoteTaskStatus.objects.create(
            remote_task=instance,
            status=0
        )
apps/models.py

default_app_config = 'app.apps.MyAppConfig'
from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name="app"

    def ready(self):
        from . import signals
from django.db import models

class RemoteTask(models.Model):
    title = models.CharField(max_length=50)

class RemoteTaskStatus(models.Model):
    remote_task = models.IntegerField()
    status = models.IntegerField()
from django.db.models.signals import post_save
from django.dispatch import receiver
from app.models import RemoteTask, RemoteTaskStatus

@receiver(post_save, sender=RemoteTask, dispatch_uid="status_new_signal_on_RemoteTask_post_save")
def status_new(sender, **kwargs):
    print '---------> Running callback'
    if kwargs.get('created', 'False') is True:
        instance = kwargs['instance']
        RemoteTaskStatus.objects.create(
            remote_task=instance,
            status=0
        )
app/signals.py

default_app_config = 'app.apps.MyAppConfig'
from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name="app"

    def ready(self):
        from . import signals
from django.db import models

class RemoteTask(models.Model):
    title = models.CharField(max_length=50)

class RemoteTaskStatus(models.Model):
    remote_task = models.IntegerField()
    status = models.IntegerField()
from django.db.models.signals import post_save
from django.dispatch import receiver
from app.models import RemoteTask, RemoteTaskStatus

@receiver(post_save, sender=RemoteTask, dispatch_uid="status_new_signal_on_RemoteTask_post_save")
def status_new(sender, **kwargs):
    print '---------> Running callback'
    if kwargs.get('created', 'False') is True:
        instance = kwargs['instance']
        RemoteTaskStatus.objects.create(
            remote_task=instance,
            status=0
        )
编辑:


添加了
dispatch\u uid
receiver
decorator。

Hmm我听说你在运行测试?有没有可能是py.test?尝试删除.pyc文件或
\uuuu pycache\uuuu
文件夹。

嗯,我听说你在运行测试?有没有可能是py.test?请尝试删除.pyc文件或
\uuuuu pycache\uuuuuu
文件夹。

您可能对“防止重复信号”感兴趣:感谢的可能重复,但这些链接对解决方案没有帮助如果我尝试您的解决方案,则会出现以下错误:“django.core.exceptions.AppRegistryNotReady:应用程序尚未加载。”您是如何解决的?您可能对“防止重复信号”感兴趣:感谢的可能重复,但这些链接对解决方案没有帮助如果我尝试您的解决方案,则会出现以下错误:“django.core.exceptions.AppRegistryNotReady:应用程序尚未加载。”您是如何解决的?谢谢@chucksmash,但我发现了一些问题。@nachopro您在signals.py中的print语句不在if语句的范围内,它检查是否正在创建或更新
实例。如果在
if
块中移动
print'----------->Running callback'
你还会看到它两次吗?是的,Chucksash,当我运行测试时(失败是因为创建了一个RemoteTask,添加了两个RemoteTaskStatus),我得到了两个打印“Running callback”@nachopro在这种情况下,您可以将
dispatch\u uid
参数传递给
接收器
装饰器:(为什么是Django,为什么?!谢谢@chucksmash,但我对此有些问题。@nachopro signals.py中的print语句不在if语句的范围内,它检查
实例是否正在创建或更新。如果在
if
块中移动
print'----------->运行callback'
,您还会看到它两次吗?是的chucksmash,当我运行测试时(失败是因为创建了一个RemoteTask,添加了两个RemoteTaskStatus),我得到了两张打印“Running callback”@nachopro,在这种情况下,您可以将
dispatch\u uid
参数传递给
接收器
装饰器:(为什么是Django,为什么?!尝试:在
\uuuu init\uuuuuuuuuuuuupy中导入app.signals
尝试:在
中导入app.signals