首页 > 解决方案 > 在 Django 中 Signal.send 后接收器函数没有响应

问题描述

我正在尝试创建一个简单的 twitter 机器人,它从不同的 API 接收信息并根据信息发布推文。我为此使用了 Django(不确定是否完全需要,但我只是想学习框架)所以我创建了 2 个不同的应用程序,一个从 API 接收信息并创建一个对象(到目前为止这个对象只是一个报价)并将其发送到另一个处理 twitter 发布的应用程序。一般的想法是,我的报价应用程序将生成一个信号,该信号将发送到发布应用程序,在该应用程序中我使用接收器装饰器创建了一个函数,因此它将一直在监听。尽管如此,由于某种原因,装饰器无法正常工作,并且在发送信号后我没有得到任何响应。

这是信号的创建:

from django.dispatch import Signal

new_quote = Signal(providing_args=['author', 'content'])

这是信号的发送:

quote=Quote.objects.create(author=author, content=content)
new_quote.send_robust(sender=quote, author=author, content=content)

对象的创建没有问题,已经检查过了。这就是信号的捕捉。

from .models import Post
from django.dispatch import receiver
from quotes.signals import new_quote
from quotes.models import Quote

@receiver(new_quote, sender=Quote)
def post_tweet(Quote, **kwargs):
    print('here')
    auth = kwargs['author']
    content = kwargs['content']

    Post.objects.create(title=auth, content=content)

打印只是用于检查函数是否实际运行。发布创建也可以正常工作,也已经检查过了。

我只是在学习 Django 并且已经阅读了文档并按照“教程”的步骤进行操作,但一定有一些我没有看到的东西。

编辑:

帖子创建者的应用文件

from django.apps import AppConfig

class PostsConfig(AppConfig):
    name = 'posts'
    def ready(self):
        import posts.signals

引用的应用程序文件: from django.apps import AppConfig

class QuotesConfig(AppConfig): 
    name = 'quotes'
    def ready(self):
        pass

标签: pythondjangopython-decorators

解决方案


发送者是类quote的一个实例,Quote接收者是为sender=Quote发送者是Quote类的地方定义的。所以,发件人不匹配。根据有关发送信号的文档,您希望将发件人定义为Quote而不是quote当您调用时send_robust


推荐阅读