Я не понимаю эту документацию по Django.Как мне использовать этот модуль? - PullRequest
2 голосов
/ 10 января 2011

Я использую модуль 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 ]

2 голосов
/ 10 января 2011

Похоже, в вашем файле настроек вам нужно установить

NOTIFICATION_QUEUE_ALL=True

А затем вам нужно настроить cronjob (возможно, каждые 10-30 секунд или что-то), чтобы запустить что-то вроде,

django_admin.py emit_notices

Это будет периодически запускаться и выполнять блокирующий вызов, который рассылает все электронные письма и все, что требуется приложению для уведомлений.Я уверен, что если ничего не поделать, то это не такая интенсивная нагрузка.

И прежде чем вы продолжите свой комментарий о том, что это глупо, вы должны подумать об этом.Это совсем не глупо.Вы не хотите, чтобы блокирующий вызов был привязан к веб-запросу, иначе пользователь никогда не получит ответ от сервера.В этом смысле отправка электронной почты блокирует.

Теперь, если вы просто хотите, чтобы человек получал это уведомление при входе в систему, вам, вероятно, не нужно идти по этому пути, потому что вам нужно сделатьвнешний звонок на sendmail или что вы используете для отправки электронных писем.Но в вашем случае, отправляя электронную почту, вы должны сделать это следующим образом.

1 голос
/ 10 января 2011

Согласно этим документам, send это просто упаковка send_now и queue.Поэтому, если вы хотите отправлять уведомления асинхронно, а не синхронно, у вас есть 2 варианта:

  1. Измените настройки:

    # This flag will make all messages default to async
    NOTIFICATION_QUEUE_ALL = True
    
  2. Использоватьqueue аргумент ключевого слова:

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

Если вы ставите уведомления в очередь, вам придется периодически запускать команду управления emit_notices.Так что вы можете поместить это в работу cron, чтобы запускать каждую пару минут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...