Redirect nach JavaScript POST request funktioniert nicht

Django, Flask, Bottle, WSGI, CGI…
Antworten
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

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')
        
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

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.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

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' %}";
                }
            })
        },
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

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.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Antworten