18

如果我从模块函数(发生时的 django 视图函数)发送信号,它不在类中,那么(对我来说)发件人应该是什么并不明显 - 如果有的话?sender=None在这种情况下是否合适?

或者,该函数由 HTTP 请求调用,我目前将其作为单独的参数传入 - 我应该改为传递它吗?

选项 A:

from django.dispatch import Signal
my_signal = Signal(
    providing_args=['my_arg', 'request']
)    

# this is a view function
def do_something(request):
    # ... do useful stuff
    my_signal.send(
        sender=None,
        my_arg="Hello",
        request=request
    )

选项 B:

from django.dispatch import Signal
my_signal = Signal(
    providing_args=['my_arg']
)    

# this is a view function
def do_something(request):
    # ... do useful stuff
    my_signal.send(
        sender=request,
        my_arg="Hello",
    )

[更新]

选项A有。在这种情况下,接收方对发送方没有任何用处(即它不是对象),因此将其设置为无。

4

2 回答 2

12

django.dispatch.Dispatcher只是说它应该是

"...[t]he sender of the signal. Either a specific object or None."

然后通过connect()与接收者联系,发送者的意义是:

"The sender to which the receiver should respond. Must either be
 of type Signal, or None to receive events from any sender"

我承认,这不是特别清楚,但在你的情况下,我会说使用sender=None,因为没有什么具体的挂钩,因为请求是短暂的。

于 2013-06-11T11:50:35.653 回答
0

函数是 Python 中的一个对象,因此您可以将 sender 设置为您的函数的引用,如下所示:

def my_func():
    my_signal.send(sender=my_func, my_arg="Hello")
于 2019-03-15T11:57:45.950 回答