【问题标题】:Django signals sending twiceDjango 信号发送两次
【发布时间】:2015-12-10 13:08:40
【问题描述】:

我正在开发一个基于 Actstream justquick/django-activity-stream/ 的简单 Django 信誉应用程序,该应用程序创建一个信号用作: rep.send(request.user, action='increase', target=obj, val=10)

但是,即使使用调度 UID:

# apps.py
from django.apps import AppConfig
from . signals import rep
from . receivers import rep_handler

class DjangoReputationConfig(AppConfig):
    name = 'django_rep'

    def ready(self):
        rep.connect(rep_handler, dispatch_uid='django_rep.models')`

我从Actstream/apps.py 复制的内容,我无法让我的信号只发送一次。我尝试了其他独特的字符串,但似乎没有任何区别。

在我的 __ init__.py 中有: default_app_config = 'django_rep.apps.DjangoReputationConfig'

谢谢!如果你想看代码,repo 是here

【问题讨论】:

    标签: django signals activity-streams


    【解决方案1】:

    我遇到了完全相同的问题。我尝试了很多东西,但最后我不得不求助于使用环境变量,如下所示:

    import os
    from django.apps import AppConfig
    
    class MyConfig(AppConfig):
        name = "xyz"
    
        def ready(self):
            if not os.environ.get("ready_called"): 
                # The development server instantiates MyConfig twice; running via gunicorn only once.
                os.environ["ready_called"] = "1" # Use this environment semaphore to prevent starting backgroundtaks more than once.
                import backgroundtasks
                backgroundtasks.install()
    

    【讨论】:

    • 谢谢 - 原来是因为我在接收器函数上有 @receiver 装饰器,并且还在 AppConfig 中连接到它 - 这是你的问题吗??
    • 不,我在 AppConfig 中做的唯一一件事就是为一些定期数据库任务启动一个后台线程。我确实在这里和那里使用@receiver 作为装饰器(我正在使用allauth),但我没有明确地连接到它。
    猜你喜欢
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 2020-08-17
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 2021-11-05
    相关资源
    最近更新 更多