我不明白这个Django文档。我该如何使用这个模块?

时间:2011-01-10 03:55:11

标签: python django asynchronous queue notifications

我正在使用django_notification模块。 https://github.com/pinax/django-notification/blob/master/docs/usage.txt

我在我的代码中执行的操作是在发生某些事情时向用户发送电子邮件:

notification.send([to_user], "comment_received", noti_dict)

但是,这似乎阻止了这个请求。发送它需要很长时间。我阅读了文档,并说它可以将它添加到队列中(异步)。如何将其添加到异步队列?

我不明白文档试图说什么。什么是“emit_notices”?我什么时候打电话给那个?我有一个每5秒调用一次的脚本吗?那太傻了。什么是异步的正确方法?我该怎么办?

Lets first break down what each does.

``send_now``
~~~~~~~~~~~~

This is a blocking call that will check each user for elgibility of the
notice and actually peform the send.

``queue``
~~~~~~~~~

This is a non-blocking call that will queue the call to ``send_now`` to
be executed at a later time. To later execute the call you need to use
the ``emit_notices`` management command.

``send``
~~~~~~~~

A proxy around ``send_now`` and ``queue``. It gets its behavior from a global
setting named ``NOTIFICATION_QUEUE_ALL``. By default it is ``False``. This
setting is meant to help control whether you want to queue any call to
``send``.

``send`` also accepts ``now`` and ``queue`` keyword arguments. By default
each option is set to ``False`` to honor the global setting which is ``False``.
This enables you to override on a per call basis whether it should call
``send_now`` or ``queue``.

2 个答案:

答案 0 :(得分:2)

在您的设置文件中,您需要设置

NOTIFICATION_QUEUE_ALL=True

然后你需要设置一个cronjob(可能每10-30秒或者其他东西)来运行类似的东西,

django_admin.py emit_notices

这将定期运行并执行阻止调用,该调用会发送所有电子邮件以及通知应用程序所需的任何内容。我敢肯定,如果没有什么可做的,那就不是那么紧张了。

在你扩展你对这个愚蠢的评论之前,你应该考虑一下。这根本不是什么傻事。您不希望将阻止调用绑定到Web请求,否则用户将永远不会从服务器获得响应。从这个意义上说,发送电子邮件是阻止的。

现在,如果你只是让这个人在登录时收到这个通知,那么你可能不需要这样做,因为你必须对sendmail进行外部呼叫或者其他任何你'用来发送电子邮件。但在你的情况下,发送电子邮件,你应该这样做。

答案 1 :(得分:1)

根据这些文档,send只是包裹send_nowqueue。因此,如果您希望以异步方式发送通知而不是同步,则有2个选项:

  1. 更改您的设置:

    # This flag will make all messages default to async
    NOTIFICATION_QUEUE_ALL = True
    
  2. 使用teh queue关键字参数:

    notification.send([to_user], "comment_received", noti_dict, queue=True)
    
  3. 如果对通知进行排队,则必须定期运行emit_notices管理命令。所以你可以把它放在一个cron工作中,每隔几分钟运行一次。