Pregunta

¿Hay alguna forma de ejecutar algún código después de la confirmación de la transacción en Django?

Necesito enviar algunos mensajes a un servidor Rabbitmq para su procesamiento fuera de línea, pero el mensaje llega al consumidor antes de que se confirme la transacción de Django.

Mi mensaje se envía en la señal post_save del modelo.Lo que estoy buscando es un mecanismo similar, que utilice señales u otra cosa, que ejecute el código después de la confirmación (y no haga nada si la transacción falla).

No he encontrado ninguna forma genérica de hacerlo en Django.¿Tienes alguna idea?

¿Fue útil?

Solución

ACTUALIZACIÓN 2:django-transaction-hooks fue fusionado en el núcleo de Django y lanzado en Django versión 1.9.

ACTUALIZAR: ganchos-de-transacción-django resuelve este problema.

No creo que exista una forma limpia de hacer esto;al menos no puedo pensar en uno.Podrías parchear django.db.transaction.commit para enviar una señal personalizada;No es bonito, pero creo que funcionaría.

También podría ser interesante plantear este caso de uso en el Lista de correo de desarrolladores de Django.Los desarrolladores generalmente son reacios a agregar nuevas señales, pero es posible que tenga un buen caso aquí (y una refutación de un desarrollador principal podría incluir una sugerencia útil sobre cómo resolver su situación).Sin embargo, es más probable que obtengas respuestas si esperas hasta que salga la versión 1.1.

Otros consejos

Espero que esto puede ayudar a alguien usando Django 1.9 o posterior. Desde 1.9 on_commit está disponible.

Así que, básicamente, que estaría haciendo de esta manera:

from django.db import transaction

transaction.on_commit(
    lambda: send_msg_to_rabbitmqp(param1, param2, ...)
)

Si desea mantener post_save, todavía se puede utilizar on_commit:

@receiver(pre_save, sender=MyModel)
def my_handler(sender, instance, created, **kwargs):
    transaction.on_commit(
        lambda: send_msg_to_rabbitmqp(instance.id)
    )

he implementado señales de transacción (post_commit y post_rollback) por mono django parches: http://gist.github.com/247844

Una posibilidad sería la de subclase el middleware de transacciones para que envíe una señal personalizada al confirmar. Su código se podría escuchar esa señal, en lugar de post_save.

Tener un vistazo a django-apio-transacciones para una solución a esto.

Recientemente he terminado la división de salida y la refactorización del código señales de código subyacente en una aplicación independiente django-DB- señales.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top