2012-12-13 15 views
5

Ich schreibe viele Aufgaben, die sehr ähnlich sind, und wollen wissen, wie man die Task Unterklasse besser zu reduzieren Boilerplate. Da eine Aufgabe nur einmal initiiert wird, kann ich die Dinge nicht in __init__ setzen, wie ich unten zeige, aber es sollte den Punkt veranschaulichen.Unterklasse Sellerie Aufgabe

, was ich versuche zu erreichen:

class EmailTaskOne(Task): 
    def run(self, object_id): 
     email_data = EmailData.objects.get(pk=object_id) 
     data = self.do_common_stuff(email_data) 
     self.do_unique_stuff(data) 

class EmailTaskTwo(Task): 
    def run(self, object_id): 
     email_data = EmailData.objects.get(pk=object_id) 
     data = self.do_common_stuff(email_data) 
     self.do_unique_stuff2(data) 

# lots more tasks like this 

Was ich möchte, ist haben:

class BaseEmailTask(Task): 
    abstract = True 
    #...Insert Magic Here... 

class EmailTaskOne(BaseEmailTask): 
    def run(self, object_id): 
     self.do_unique_stuff(self.data) 

Also, da __init__ direkt aus ist, wo richte ich die Klasse in der abstrakte Klasse. Ich kann eine Reihe von Funktionen ziemlich einfach definieren, wenn ich nur einige Dinge aus dem System herausrechnen möchte, aber einige (Lose) des Boilerplate hängen von der object_id ab.

+0

möglich Duplikat [Sellerie Aufgabe und fertigen Dekorateur] passieren (http://stackoverflow.com/questions/6393879/celery-task- and-customize-decorator) – Louis

+0

Während die Lösung anwendbar ist - die Frage ist anders. Daher denke ich nicht, dass es ein Duplikat ist. Wenn ich versuche, die TROCKNUNG meiner Aufgaben zu erhöhen, indem ich Mixins und Sublcassing von Aufgaben verwende, würde ich nicht nach "Customize Decorator", sondern nach "Subclass" oder "Mixin" oder so ähnlich suchen. – yarbelk

Antwort

6

Hilft mir die Antwort von MauroRocco?

siehe celery task and customize decorator

Es gelang mir Argumente zu einem erweiterten Aufgaben

+0

Obwohl ich Link-Antworten nicht gerne akzeptiere, ist dies eine gute Antwort. kurz - überschreiben Sie die '__call__' Methode anstelle der' __init__' – yarbelk

+0

Es ist ein Link zu meiner eigenen Antwort ... es ist auch hier geeignet –

Verwandte Themen