Seite 1 von 1

Redirect nach JavaScript POST request funktioniert nicht

Verfasst: Sonntag 24. Oktober 2021, 15:04
von naheliegend
Hi,

clientseitig wird mit dem der JS-Funktion:

Code: Alles auswählen

onApprove: function (data) { 
            var url = "{% url 'payment_complete' %}"
            return fetch(url, {
            method: 'POST',
            headers: {
                'content-type': 'application/json',
                'X-CSRFToken': csrftoken,
            },
            body: JSON.stringify({
                transaction_id: data.orderID
           	 })
            })
       	 }


die transaction_id einer Bezahlung an /payment_complete/ weitergereicht. Das funktioniert auch.

Serverseitig in der views.py versuche ich nun den Client je nachdem, ob die Bezahlung "approved" wurde oder "declined" zu redirecten. Der redirect auf 'checkout_success' wird ausgeführt. Das sehe ich in der Konsole:

Code: Alles auswählen

[24/Oct/2021 15:46:47] "GET /checkout_success/ HTTP/1.1" 200 5757
, aber ich lande auf der page, auf der ich das Javascript der Buttonklick aufgerufen habe und nicht auf checkout_success.


views.py:

Code: Alles auswählen

def payment_complete(request):
    body = json.loads(request.body)
    transaction_id = body["transaction_id"] 

    try:
        response_for_order = GetOrder().get_order(transaction_id) #status der transaction abfragen
        if response_for_order.result.status == 'APPROVED'
        	return redirect('checkout_success')
        else:
        	return redirect('checkout_failed')	
    except:
        print("something went wrong.")
        return redirect('checkout_failed')
        

Re: Redirect nach JavaScript POST request funktioniert nicht

Verfasst: Sonntag 24. Oktober 2021, 15:26
von Sirius3
Wo machst du denn was mit Ergebnis das Dir fetch auf Javascript-Seite liefert? Auf Python-Seite würde ich eine json-Antwort erwarten, und kein Redirect.

Re: Redirect nach JavaScript POST request funktioniert nicht

Verfasst: Sonntag 24. Oktober 2021, 16:05
von naheliegend
Sirius3 hat geschrieben: Sonntag 24. Oktober 2021, 15:26 Wo machst du denn was mit Ergebnis das Dir fetch auf Javascript-Seite liefert? Auf Python-Seite würde ich eine json-Antwort erwarten, und kein Redirect.
Mach ich nichts mit. Hatte gehofft, ich könnte einfach Python-seitig schon den redirect vollziehen, ohne, dass ich dann JS-seitig aufgrund der response vom fetch dann redirecte.

Re: Redirect nach JavaScript POST request funktioniert nicht

Verfasst: Sonntag 24. Oktober 2021, 16:22
von __deets__
Das nackte except in deiner payment_complete ist ein code smell. Sollte durch eine explizite Reihe von möglichen Ausnahmen ersetzt werden.

Zu deinem Problem: das geht halt nicht. Entweder lässt du den Browser selbst das request stellen, und dann lädt der das Resultat als neue Seite, Redirect inklusive. Oder du machst das via JS, aber dann musst auch du selbst mit dem Ergebnis etwas machen. Es ist ja gerade der Sinn von diesen Requests in JS, das sie nicht die Seite verlassen.

Re: Redirect nach JavaScript POST request funktioniert nicht

Verfasst: Sonntag 24. Oktober 2021, 16:57
von naheliegend
Okey, danke. Habe das nun so, dass ich je nach Orderresultat

Code: Alles auswählen

return JsonResponse("success", safe=False)
oder etwas anderes returne und das im JS dann in der Variable response auffange und einsortiere.

Code: Alles auswählen

        onApprove: function (data) { 
            var url = "{% url 'payment_complete' %}"
            return fetch(url, {
            method: 'POST',
            headers: {
                'content-type': 'application/json',
                'X-CSRFToken': csrftoken,
            },
            body: JSON.stringify({
                transaction_id: data.orderID
            })
            })
            .then(response => response.json())
            .then(response_data => {
                if (response_data == 'success') {
                    location.href = "{% url 'checkout_success' %}";
                } else {
                    location.href = "{% url 'checkout_fail' %}";
                }
            })
        },

Re: Redirect nach JavaScript POST request funktioniert nicht

Verfasst: Sonntag 24. Oktober 2021, 17:01
von __deets__
Was macht denn das erste then? Ist das nicht ueberfluessig?

Und du kannst die URLs doch auch zurueckgeben, und damit innerhalb des JS auf das if verzichten.

Re: Redirect nach JavaScript POST request funktioniert nicht

Verfasst: Dienstag 26. Oktober 2021, 20:55
von naheliegend
Bestimmt kann man das auch anders lösen, aber das erste then müsste das JSON-Objekt auflösen und das zweite then fängt das promise auf, also den Wert in diesem Fall.

Jo, habe nun direkt die urls im json-object.