2011-01-10 2 views
2

Я использую модуль django_notification. https://github.com/pinax/django-notification/blob/master/docs/usage.txtЯ не понимаю эту документацию Django. Как использовать этот модуль?

Это то, что я в своем коде, чтобы отправить письмо пользователю, когда что-то происходит:

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

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

NOTIFICATION_QUEUE_ALL=True 

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

django_admin.py emit_notices 

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

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

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

1

Согласно этим документам, send просто оборачивать send_now и queue. Так что если вы хотите отправить уведомления асинхронных вместо синхронного у вас есть 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) 
    

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

Смежные вопросы