Is there any way to run some code after transaction commit in Django?
I need to send some messages to a rabbitmq server for offline processing, but the message gets to the consumer before the Django transaction is commited.
My message is sent in the post_save signal of the model. What I'm looking for is a similar mechanism, using signals or something else, that would execute code after the commit (and do nothing if the transaction fails).
I haven't found any generic way of doing it in Django. Do you have any ideas?
Have a look at django-celery-transactions for a solution to this.
I've recently finished splitting-out and refactoring the underlying signals code code into a stand-alone app django-db-signals.
I have implemented transaction signals (
post_commit
andpost_rollback
) by monkey patching django: http://gist.github.com/247844One possibility would be to subclass the transaction middleware so that it sends a custom signal on commit. Your code could listen for that signal, rather than post_save.
UPDATE 2: django-transaction-hooks was merged into Django core and released in Django version 1.9.
UPDATE: django-transaction-hooks solves this problem.
I don't believe there is a clean way to do this; at least I can't think of one. You could monkeypatch django.db.transaction.commit to send a custom signal; not pretty but I think it would work.
Might also be interesting to raise this use-case on the django-developers mailing list. The devs are generally averse to adding new signals, but you might have a good case here (and a rebuttal from a core dev might include a useful suggestion of how to resolve your situation). You're more likely to get responses if you wait until after 1.1 comes out, though.
Hope this may help someone using Django 1.9 or later. Since 1.9 on_commit is available.
So basically you would be doing it like this:
If you wish to keep
post_save
, you can still useon_commit
: