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.pyich 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

Schreibe einen Kommentar