2011-01-10 5 views
2

J'utilise le module django_notification. https://github.com/pinax/django-notification/blob/master/docs/usage.txtJe ne comprends pas cette documentation de Django. Comment est-ce que je l'utilise ce module?

C'est ce que je fais dans mon code pour envoyer un e-mail à un utilisateur lorsque quelque chose se passe:

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

Mais, cela semble bloquer la demande. Et il faut beaucoup de temps pour l'envoyer. J'ai lu les docs et il est dit qu'il est possible de l'ajouter à une file d'attente (asynchrone). Comment l'ajouter à une file d'attente asynchrone?

Je ne comprends pas ce que les docs essayent de dire. Qu'est-ce que "emit_notices"? Quand est-ce que je l'appelle? Est-ce que j'ai un script qui appelle toutes les 5 secondes? C'est bête. Quelle est la bonne façon de le faire de manière asynchrone? Que fais-je?

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``. 

Répondre

2

Il ressemble dans vos paramètres fichier devez définir

NOTIFICATION_QUEUE_ALL=True 

Et vous devez configurer une tâche cron (peut-être toutes les 10-30 secondes ou quelque chose) pour exécuter quelque chose comme,

django_admin.py emit_notices 

Cette opération s'exécute périodiquement et exécute l'appel de blocage qui envoie tous les e-mails et tout ce dont l'application de notification a besoin. Je suis sûr que s'il n'y a rien à faire, ce n'est pas une tâche aussi intense.

Et avant de développer votre commentaire à propos de ce que c'est idiot, vous devriez y penser. Ce n'est pas vraiment idiot du tout. Vous ne voulez pas qu'un bloquant l'appel soit lié à une requête Web, sinon l'utilisateur ne recevra jamais de réponse du serveur. Envoyer un e-mail bloque dans ce sens. Maintenant, si vous vouliez simplement que la personne reçoive cette notification lors de sa connexion, alors vous n'avez probablement pas besoin de passer par là parce que vous devez faire un appel externe vers sendmail ou quoi que vous utilisiez pour envoyer des emails. Mais dans votre cas, l'envoi de courriels, vous devriez le faire de cette façon.

1

Selon ces documents, send est juste emballage send_now et queue. Donc, si vous voulez envoyer les notifications asynchrones au lieu de synchronisation que vous avez 2 options:

  1. Modifier vos paramètres:

    # This flag will make all messages default to async 
    NOTIFICATION_QUEUE_ALL = True 
    
  2. Utilisez Teh argument mot-clef queue:

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

Si vous mettez en file d'attente les notifications, vous devrez exécuter le emit_notices commande de gestion périodiquement. Donc, vous pourriez mettre cela dans un travail cron pour courir toutes les deux minutes.

Questions connexes