2017-12-28 3 views
0

Ich führe eine Aufgabe aus, um ein Konto bei einem Drittanbieterdienst zu erstellen und relevante Daten aus der Antwort dieses Dienstes auf mein profile Objekt zu speichern. Die Aufgabe wird ausgeführt und die Daten werden korrekt zurückgegeben, aber nicht ordnungsgemäß auf dem Objekt gespeichert.Antwortdaten können nicht in Instanzfeldern gespeichert werden. Andere Daten in demselben Block werden korrekt gespeichert (Django/Sellery)

Relevante Code:

# payload is generated in helper method. if that was the point of 
    # failure, i'd see an error 
    result = self.third_party_client.post(self.creation_endpoint, payload) 

    json_result = result.json() 

    if json_result.get('Error') != 'SUCCESS': 
     # Account Creation Failed. error is handled. 
    else: 
     # Currently I log this on our staging server to make sure 
     # the data's coming back properly; it is returned as expected 
     self.logger.error('CoreCard Account Created. Data: {}'.format(json_result)) 
     profile = user.profile 
     profile.account_number = json_result.get('AccountNumber') 
     profile.card_number_last_four = int(json_result.get('CardNumber')[12:]) 
     profile.customer_id = json_result.get('CustomerID') 
     profile.account_creation_datetime = datetime.datetime.utcnow() 
     profile.save() 

Also, wenn ich diese dann abfragen profile Instanz, es hat den account_creation_datetime Wert wie erwartet, aber die anderen Felder sind leer. Ich habe die Protokolle überprüft und die json_result Werte sind alle korrekt.

Jetzt ist hier, wo es ein bisschen komisch ist. Wo ich denke, dass es tatsächlich fehlschlägt, ist die Sellerie-Aufgabe, die das Dienstprogramm aufruft, das dieses Bit Code ausführt. Wenn ich dieses Dienstprogramm manuell ausführe, werden die Felder ordnungsgemäß gespeichert. Wenn ich es als Teil unseres normalen Arbeitsablaufs (innerhalb einer asynchronen Task aufgerufen) ausführe, wird das Konto auf dem Dienst des Drittanbieters erstellt, so dass dieser Code ausgeführt wird, aber die Felder profile (außer account_creation_datetime) leer sind. Die Aufgabe sieht wie folgt aus:

@shared_task(bind=True, max_retries=3) 
def create_account_task(self, guid): 
    profile = Profile.objects.get(historical_id=guid) 
    profile.account_creation_worker_id = current_task.request.id # Per http://docs.celeryproject.org/en/latest/reference/celery.html#celery.current_task 
    profile.save() 

    # Sanity Check 
    if profile.approval_date is not None: 
     util = CoreCardUtility() 
     util.create_corecard_account(profile.user) 
     return True 
    return False 

In diesem Workflow profile.account_creation_worker_id ist auch nicht korrekt gespeichert, auch wenn ich weiß, dass die Aufgabe lief, weil das Konto auf dem Dritt-Service erstellt wird.

Ich bin ein bisschen verloren - gibt es ein Problem mit Sellerie Arbeiter oder Threading, die ich hier vermisse?

Vielen Dank für Ihre Hilfe!

Antwort

0

Um die Task-ID (für Sellerie Version 2.2.0 oben) zu erhalten,

profile.account_creation_worker_id = create_account_task.request.id 

statt

profile.account_creation_worker_id = current_task.request.id 

Wahrscheinlich ist Ihre Aufgabe werfen Fehler nicht ausgeführt wird und muss. Haben Sie Sellerie-Protokoll überprüft?

+0

Hallo Ashish, danke für deinen Kommentar! Ich glaube nicht, dass das der Fehler ist; Das Konto wurde nicht auf dem Drittanbieterdienst erstellt, wenn die Aufgabe nicht ausgeführt wurde. Wir verwenden das 'current_task'-Muster für die Sellerie-Dokumente; Es hat überall sonst erfolgreich funktioniert. http://docs.selleryproject.org/en/latest/reference/sellery.html#sellery.current_task –

Verwandte Themen