Podczas pracy nad ASU Repozytorium Cyfrowego, znalazłem musiałem zdolność do wywoływania wywołania zwrotne, gdy transakcja została zatwierdzona. Sygnały Django wydaje się być idealnym mechanizmem, ale transakcja popełnić i nie są sygnały wycofania (jak to pisze) obsługiwane w ramach podstawowej. (Zobacz te bilety w śledzenia błędów Django dla tła: Ticket # 14050, # 14051 biletów)
Jednak sedno napisał Gr & eacute; Goire Cachet wydaje rade. Dodaje realizacji sygnału niestandardowego i małpy łatek transakcji Django funkcje wysyłką sygnały post_commit i post_rollback obsługi.
django_transaction_signals jest aplikacja Django, który rozciąga się, że sens w następujący sposób:
- Dodaje funkcję odroczenia (), które mogą być używane wewnątrz transakcji odroczyć wykonanie funkcji, dopóki transakcja zobowiązała (znalazłem to bardzo przydatne do uruchamiania zadań Celery, które zależą od obiektów popełnione).
- Ochrona przed źle wychowane obsługi sygnałów (czyli takie, które opuszczają bieżącej transakcji w brudnym stanie) i podnosi BadlyBehavedTransactionSignalHandlerError razie wystąpienia obsługi niewłaściwie.
- Czyści teleskopowe na wyjeździe transakcji, niezależnie od tego, czy popełnić, wycofania lub nie występowały. To rozwiązuje problem, gdzie może gromadzić się i koparki być uruchamiane przy kolejnej transakcji.
Wykorzystanie (z pierwotnego GIST):
Musisz upewnić się, aby załadować to przed używać sygnałów.
Na przykład, dodaj następującą linię do __init__.py pliku twojego projektu:
django_transaction_signals importowe
Następnie, w celu korzystania z sygnałów tworzyć funkcję i powiązać go z sygnałem post_commit:
z django.db transakcji importowej
My_function def (** kwargs):
& Nbsp; # zrobić swoje rzeczy tutaj
& Nbsp; karnet
transaction.signals.post_commit.connect (My_function)
Jeśli jesteś za pomocą zmiennych nielokalnych w funkcji zwrotnej, należy używać nie słaby odniesienia lub zmienne mogą być śmieci zbierane przed funkcja jest wywoływana. Na przykład, w modelu Zachowajmy metody ():
def zapisać (self, * args, ** kwargs):
& Nbsp; def My_function (** kwargs):
& Nbsp; # zrobić swoje rzeczy tutaj
& Nbsp; # zmienna dostęp własny
& Nbsp; samo
& Nbsp; transaction.signals.post_commit.connect (My_function, słaby = False)
Funkcja Wykorzystanie odroczyć ():
odroczenia () rejestruje funkcję do uruchomienia po pomyślnym zakończeniu bieżącej transakcji (jeśli taki istnieje). Wywołanie defer (func, * args, ** kwargs) przekłada się na następujące:
- Jeśli transakcja jest aktywna, zarejestruj post-commit słuchacza do wykonywania func (* args, ** kwargs)
- Jeśli żadna z transakcji nie jest aktywna, należy wykonać func (* args, ** kwargs) bezpośrednio
Ten przykład pokazuje transakcyjnej aktualizacji obiektu modelu, który rejestruje zadanie Seler być wykonywane, gdy transakcja zobowiązuje się powodzeniem.
z celery.task zadania importu
z django.db transakcji importowej
z django_transaction_signals importu odroczyć
Import pysolr
@ Transaction.commit_on_success
update_object def (obj):
& Nbsp; # ... modyfikować i zapisywać obiekt ...
& Nbsp; odroczenia (index_object.delay, obj)
& Nbsp; # ... zrobić kilka dodatkowych prac w transakcji ...
Task
index_object def (obj):
& Nbsp; index_obj = {"id": obj.id}
& Nbsp; # ... zbudować indeks obiektów ...
& Nbsp; solr = pysolr.Solr ("http: // localhost: 8080 / solr ')
& Nbsp; solr.add ([index_obj])
Wymagania :
- Python
- Django
Komentarze nie znaleziono