2010-02-28 5 views
1

J'ai ajouté un signal à mon modèle, qui envoie un e-mail à certaines adresses e-mail une fois le modèle enregistré (via models.signals.post_save.connect signal et send_mail pour l'envoi de courrier électronique). Cette idée fait encore du retard pour les utilisateurs, quand ils enregistrent le modèle sur le site, ils doivent attendre que tous ces emails soient envoyés et c'est quand ils reçoivent une réponse du serveur. Avant d'essayer les signaux, j'avais essayé d'envelopper la méthode de sauvegarde de mon modèle, et après super(Foo, self).save(*args, **kwargs) j'envoyais des courriels. Cette expérience de retard arrivait avec cette méthode aussi. Je veux simplement que mes actions d'envoi d'email soient faites en arrière-plan, sans montrer de retard aux utilisateurs sur le site.Django modèles, les signaux et les délais d'envoi de courrier électronique

Comment cela peut-il être résolu?

Répondre

1

La meilleure chose est à la file d'attente les messages électroniques et les ont envoyés par un démon. Découvrez django-mailer.

Puisque vous ne semblez être concerné par send_mail, vous pouvez commencer avec deux étapes. Tout d'abord, l'utiliser pour importer la version django-mailer de send_mail:

# favour django-mailer but fall back to django.core.mail 
from django.conf import settings 

if "mailer" in settings.INSTALLED_APPS: 
    from mailer import send_mail 
else: 
    from django.core.mail import send_mail 

Et puis créez une tâche cron qui appelle manage.py send_mail d'envoyer le courrier. Vérifiez les django-mailer usage docs par exemple les entrées cronjob.

Si vous ne voyez aucun email envoyé, essayez d'exécuter manage.py send_mail sur la console. Cela semble être le problème numéro un des gens.

2

Pour éviter un retard de la réponse, vous souhaitez effectuer cette opération de manière asynchrone dans un autre processus.

Cette question porte sur la façon de traiter que: Advice on Python/Django and message queues