سؤال

هل هناك أي طريقة لتشغيل بعض الكود بعد ارتكاب المعاملة في django؟

أحتاج إلى إرسال بعض الرسائل إلى خادم RabbitMQ للمعالجة غير المتصلة، لكن الرسالة تصل إلى المستهلك قبل أن يتم ارتكاب معاملة Django.

يتم إرسال رسالتي في إشارة post_save للنموذج. ما أبحث عنه هو آلية مماثلة، باستخدام الإشارات أو أي شيء آخر، من شأنها تنفيذ التعليمات البرمجية بعد الالتزام (ولا تفعل شيئا إذا فشل المعاملة).

لم أجد أي طريقة عامة للقيام بذلك في Django. هل لديك أي أفكار؟

هل كانت مفيدة؟

المحلول

تحديث 2.: Django-Transaction-Hooks كان اندمج في جانجو الأساسية وأصدرت في Django الإصدار 1.9.

تحديث: Django-Transaction-Hooks يحل هذه المشكلة.

لا أعتقد أن هناك طريقة نظيفة للقيام بذلك؛ على الأقل لا أستطيع التفكير في واحد. يمكنك أن تكون المجدون django.db.transaction.commit لإرسال إشارة مخصصة؛ ليست جميلة ولكن أعتقد أنها ستعمل.

قد تكون أيضا مثيرة للاهتمام لرفع حالة الاستخدام هذه على قائمة البريدية DJANGO-Developers. وبعد تكرر Devs عموما إضافة إشارات جديدة، لكن قد تكون لديك حالة جيدة هنا (وقد تتضمن Rebuttal من Dev Core اقتراحا مفيدا لكيفية حل موقفك). من المرجح أن تحصل على ردود إذا انتظرت حتى بعد 1.1 يخرج، رغم ذلك.

نصائح أخرى

آمل أن يساعد هذا شخصا في استخدام Django 1.9 أو الأحدث. منذ 1.9. on_commit متاح.

لذلك في الأساس سوف تفعل ذلك مثل هذا:

from django.db import transaction

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

إذا كنت ترغب في الاحتفاظ بها post_save, ، لا يزال بإمكانك استخدامها on_commit:

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

لقد نفذت إشارات المعاملات (post_commit و post_rollback) بواسطة قرد الترقيع django:http://gist.github.com/247844.

يمكن أن يكون أحد الاحتمالات الفرعية لتقييم الصفقة بحيث يرسل إشارة مخصصة على الالتزام. يمكن أن يستمع الكود الخاص بك إلى تلك الإشارة، بدلا من post_save.

القي نظرة على Django-الكرفس المعاملات لحل هذا.

لقد انتهيت مؤخرا تقسيم وإعادة صياغة رمز رمز الإشارات الأساسي في تطبيق مستقل DJANGO-DB-إشارات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top