Sellerie Aufgabe und anpassen, Dekorateur
Arbeite ich an einem Projekt mit django und Sellerie(django-celery). Unser team hat sich entschieden, wickeln Sie alle Daten Zugriff-code innerhalb (app-name)/manager.py
(NICHT wickeln, in die Führungskräfte wie die django
Weg), und lassen Sie code in (app-name)/task.py nur den Umgang mit zusammenbauen und ausführen von Aufgaben mit Sellerie(so haben wir nicht django ORM-Abhängigkeit in dieser Schicht).
In meinem manager.py
ich habe so etwas wie dieses:
def get_tag(tag_name):
ctype = ContentType.objects.get_for_model(Photo)
try:
tag = Tag.objects.get(name=tag_name)
except ObjectDoesNotExist:
return Tag.objects.none()
return tag
def get_tagged_photos(tag):
ctype = ContentType.objects.get_for_model(Photo)
return TaggedItem.objects.filter(content_type__pk=ctype.pk, tag__pk=tag.pk)
def get_tagged_photos_count(tag):
return get_tagged_photos(tag).count()
In meinem task.py ich mag wickeln Sie Sie in Aufgaben (dann vielleicht mit diesen Aufgaben zu erledigen komplizierter Aufgaben), so Schreibe ich diese decorator:
import manager #the module within same app containing data access functions
class mfunc_to_task(object):
def __init__(mfunc_type='get'):
self.mfunc_type = mfunc_type
def __call__(self, f):
def wrapper_f(*args, **kwargs):
callback = kwargs.pop('callback', None)
mfunc = getattr(manager, f.__name__)
result = mfunc(*args, **kwargs)
if callback:
if self.mfunc_type == 'get':
subtask(callback).delay(result)
elif self.mfunc_type == 'get_or_create':
subtask(callback).delay(result[0])
else:
subtask(callback).delay()
return result
return wrapper_f
dann (immer noch in task.py
):
#@task
@mfunc_to_task()
def get_tag():
pass
#@task
@mfunc_to_task()
def get_tagged_photos():
pass
#@task
@mfunc_to_task()
def get_tagged_photos_count():
pass
Dinge, die funktionieren, ohne @task
.
Aber, nach der Anwendung, dass @task
decorator(nach oben wie Sellerie Dokumentation angewiesen), die Dinge gerade zu zerfallen beginnen. Offensichtlich, jedes mal, wenn die mfunc_to_task.__call__
aufgerufen wird, die gleichen task.get_tag
Funktion übergeben bekommt, wie f
. So landete ich mit dem gleichen wrapper_f
jeder Zeit, und jetzt das einzige, was ich mit der Katze tun ist, um ein einzelnes tag.
Ich bin neu bei Dekorateuren. Kann jemand mir helfen zu verstehen, was hier schief gelaufen, oder zeigen Sie andere Wege zur Erreichung der Aufgabe? Ich hasse es, zu schreiben, die die gleiche Aufgabe wrap-code für alle meine Daten Zugriff auf Funktionen.
InformationsquelleAutor der Frage zxygentoo | 2011-06-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht ganz sicher, warum die Weitergabe von Argumenten funktioniert nicht?
wenn Sie dieses Beispiel verwenden:
können hinzufügen, einige Protokollierung der MyCoolTask:
und erstellen Sie eine erweiterte Klasse (Verlängerung MyCoolTask, aber jetzt mit Argumenten):
und stellen sicher, passieren Sie die kwargs als json-Daten:
Bekomme ich das Ergebnis:
InformationsquelleAutor der Antwort michel.iamit
Anstelle der Verwendung Dekorateur, warum Sie nicht erstellen Sie eine base-Klasse erweitern
celery.Task
?In dieser Weise werden alle Ihre Aufgaben erweitern können Ihre benutzerdefinierten task-Klasse, wo Sie implementieren können, die Ihr persönliches Verhalten mit Methoden der
__call__
undafter_return
.
Sie können auch definieren gemeinsame Methoden und Objekt für alle Ihre Aufgabe.
InformationsquelleAutor der Antwort Mauro Rocco