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!
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 –