¿post_save.connect se ejecuta dos veces?

52 views
Skip to first unread message

Lex Luthor

unread,
Jan 26, 2012, 3:05:10 PM1/26/12
to Django-es
Hola a todos, tengo la siguiente duda:
Utilizanco post_save.connect en el models.py para enviar un correo
cuando hay un nuevo elemento en una tabla de la base de datos me
percato de que envia dos correos en vez de uno. El codigo es el
siguiente:

from django.db.models.signals import post_delete, post_save, pre_save
...
...


def enviar_email_noticia (sender, **kwargs):
noticia = kwargs['instance']
topic = noticia.titulo
message = noticia.cuerpo
lista_usuarios = Usuario.objects.filter(enviar_noticia=True)
for usuario in lista_usuarios:
correo = usuario.email
send_mail ( topic, message, 'Nueva Noticia.', [correo])



pre_save.connect(enviar_email_noticia, sender=Noticia)

Tengo una tabla noticia y otra usuario.

Lo que quiero hacer es que cada vez que inserte una noticia en la base
de datos, poder enviar un correo con la noticia a todos los usuarios
que lo tengan activo.

Funcionar funciona, pero con el inconveniente de que envia siempre las
noticias repetidas, de dos en dos, es decir, cada vez que se inserta
una nueva noticia, es enviado dos correos con la noticia, a cada
ususario que lo tiene activo.

He quitado hasta el for pensando que de ahí venia el problema, pero
nada. incluso en una prueba puse el correo directamente es decir puse

send_mail (topic, message, 'Nueva Noticia', ['ejli...@gmail.com'])

y también la envió dos veces.


Entonces me da que pensar que cada vez que se guarda un elemento en la
tabla, se ejecuta dos veces post_save(), cosa que dudo, por eso
necesito una mano para esta cuestión. Un saludo. y gracias

Eduard Diaz

unread,
Jan 26, 2012, 3:40:22 PM1/26/12
to djan...@googlegroups.com
Hola,

No he hecho ninguna prueba, pero me da que el problema es que utilizas el pre_save.

Piensa que si quieres enviar un email a tus usuarios de que se ha publicado una noticia, ¿no tendrias que utilizar el evento  post_save?,  ya que si al guardar, por el motivo que sea, se aborta la acción, habras enviado un email de una noticia que no se habrá publicado. Ademas el enviar emails de esa manera es bloqueante, no se guarda nada en la base de datos hasta que se envien todos los emails.

Prueba con el post_save e intenta que el envio de emails sea mediante cron mira:
https://github.com/t11e/django-chronograph


Un saludo



--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
 Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
 Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
 Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.

Emilio José Linero Garrido

unread,
Jan 26, 2012, 3:52:48 PM1/26/12
to djan...@googlegroups.com
Hola,
Ante todo gracias por contestar, no creo que sea del pre-save, ya que al principio lo que utilizaba era el post_save. El pre_save se me ha colado en la pruebas. El que utilizo es el post_save. Gracias.

Juan Ignacio

unread,
Jan 28, 2012, 4:17:15 PM1/28/12
to djan...@googlegroups.com
Lei algo de esto hace tiempo y creo recordar que era por algo que
pasaba cuando usabas el entorno de "runtime server" de django. Prueba
el código con un servidor wsgi como apache y mira a ver si lo ejecuta
dos veces.

No recuerdo los detalles pero creo que era porque al validar los
modelos los carga dos veces, y como resultado se asocian dos veces el
mismo signal. O algo asi.

2012/1/26 Emilio José Linero Garrido <ejli...@gmail.com>:

--
Juan Ignacio Rodríguez de León
Móvil: 605 890514
E-Mail: euri...@gmail.com
http://www.metriz.com/
http://descon2.com/
http://www.elornitorrincoenmascarado.com/

Andrés gutiérrez

unread,
Jan 28, 2012, 6:31:26 PM1/28/12
to djan...@googlegroups.com

Yo lei el otro dia que el server de desarrollo de django se esta ejecutando dos veces. Uno para ejecutar la aplicación y el otro para detectar cuando hacemos cambios y reiniciar el otro proceso

zodman

unread,
Jan 30, 2012, 12:06:09 PM1/30/12
to djan...@googlegroups.com
Puedes agregar un campo la noticia que se llame enviado de tipo
booleano default false

Entonces cuando se salve checa esa flag para enviar o no la noticias
cuando ya se haya enviando cambia a la a true.

Asi ignoras la noticia que se envie 2 veces.

Saludos

2012/1/26 Lex Luthor <ejli...@gmail.com>:

Lex Luthor

unread,
Jan 31, 2012, 10:52:48 AM1/31/12
to Django-es
SOLUCIONADO--------------------------
He tenido que crear una nueva tabla en la base de datos. en dicha
tabla solo guardo la noticia que ya ha sido enviada. Entonces lo que
hago es que cada vez que hay un post_save, compruebo que esa noticia
no exite en la tabla, para proceder a enviarla a la lista de usuario,
y después de haberla enviado, la guardo en la susodicha tabla.
> send_mail (topic, message, 'Nueva Noticia', ['ejlin...@gmail.com'])
Reply all
Reply to author
Forward
0 new messages