从django-admin命令发送django信号?

3 投票
2 回答
1685 浏览
提问于 2025-04-16 13:05

我遇到了一个不寻常的问题。在我的Django应用中,我使用信号来发送电子邮件。所有的信号都能正常工作,除了从django-admin命令触发的那个信号——django.core.management.base.NoArgsCommand(这个是通过manage.py运行的)。

我在不同的地方检查了我的信号,它在其他地方都能正常工作,只有在这个地方不行。

这是我发送信号的代码:

from django.core.management.base import NoArgsCommand

class Command(NoArgsCommand):
    help = "Send email advertisement expiration reminder to users"

    def handle_noargs(self, **options):
        from app.models import Advertisement, User
        from app.signals import ad_expires
        from datetime import datetime
        start=datetime(datetime.now().year, datetime.now().month, datetime.now().day+4,0,0)
        end=datetime(datetime.now().year,datetime.now().month,datetime.now().day+4,23,59)
        ads=Advertisement.objects.filter(visible_till__gte=start).filter(visible_till__lte=end)
        for ad in ads:
            ad_expires.send(self,ad=ad, user=ad.user)
        print "Expiration reminders sent to %s users" % len(ads)

我是不是做错了什么?

另外,有没有更简单的方法来检查一天内的日期?

2 个回答

1

我能想到的唯一原因是,当执行django-admin函数时,信号处理器还没有被注册。你可以在监听器前面加一个print语句,然后运行你的管理命令来检查这一点。

试着把信号监听器放到app/__init__.py文件里。因为你正在访问app这个包,所以__init__.py里的所有内容都会执行,这样就能注册监听器了。

2

快捷键是:

start = datetime.now() + timedelta(days=4)
end = start + timedelta(days=1)
ads=Advertisement.objects.filter(visible_till__gte=start).filter(visible_till__lt=end)

你能把你的项目结构发过来吗?我觉得你的代码看起来不错。

撰写回答