2011-09-08 32 views
5

ढेर नहीं है मैं मैन्युअल लेनदेन प्रबंधन के साथ एक Django - Celery कार्य चलाने के लिए चाहता हूं, लेकिन ऐसा लगता है कि एनोटेशन ढेर नहीं है।Django - अजवाइन: @transaction और @task

उदा।

---> 22  pong.delay('arg') 

AttributeError: 'function' object has no attribute 'delay' 

में

def ping(): 
    print 'ping' 
    pong.delay('arg') 

@task(ignore_result=True) 
@transaction.commit_manually() 
def pong(arg): 
    print 'pong: %s' % arg 
    transaction.rollback() 

परिणाम

TypeError: pong() got an unexpected keyword argument 'task_name' 

जबकि रिवर्स एनोटेशन क्रम में परिणामों को यह समझ में आता है, लेकिन मैं मुसीबत एक अच्छा वैकल्पिक हल खोजने आ रही है। Django दस्तावेज़ एनोटेशन के विकल्पों का उल्लेख नहीं करते हैं, और जब मुझे एक की आवश्यकता नहीं है, तो मैं प्रत्येक अजवाइन कार्य के लिए कक्षा नहीं बनाना चाहता हूं।

कोई विचार?

उत्तर

8

पहले अजवाइन कुछ जादू जहां डिफ़ॉल्ट कीवर्ड तर्क का एक सेट कार्य करने के लिए पारित किए गए, तो यह उन्हें स्वीकार कर लिया था।

संस्करण 2.2 के बाद से यदि आप इस व्यवहार को निष्क्रिय कर सकते हैं, लेकिन सबसे आसान आयात करने के लिए celery.taskcelery.decorators के बजाय से task डेकोरेटर है:

from celery.task import task 

@task 
@transaction.commit_manually 
def t(): 
    pass 

decorators मॉड्यूल बहिष्कृत है और इसे पूरी तरह से 3.0 में निकाल दिया जाएगा, और "जादू कीवर्ड तर्क"

नोट: कस्टम कार्य कक्षाओं के लिए आपको accept_magic_kwargs विशेषता को गलत पर सेट करना चाहिए:

class MyTask(Task): 
    accept_magic_kwargs = False 

टिप्पणी 2: सुनिश्चित करें कि आपके कस्टम सज्जाकार functools.wraps का उपयोग कर समारोह के नाम को बरकरार रखता है, अन्यथा कार्य गलत नाम के साथ खत्म हो जाएगा।

+0

यह वही है जो मैं उम्मीद कर रहा था! धन्यवाद! – Rob

6

कार्य सजावट run विधि के साथ आपके कार्य के रूप में class x(Task) आपके कार्य के रूप में उत्पन्न करता है। सुझाव है कि आप कक्षा को परिभाषित करें और विधि को सजाने के लिए।

Untested उदा .:

class pong(Task): 
    ignore_result = True 

    @transaction.commit_manually() 
    def run(self,arg,**kwargs): 
    print 'pong: %s' % arg 
    transaction.rollback() 
+0

ऐसा करने के लिए एक गैर-वर्ग तरीका खोजने की उम्मीद थी, लेकिन मुझे लगता है कि यह सबसे अच्छा विकल्प है। धन्यवाद! – Rob

संबंधित मुद्दे