2016-04-07 6 views
0

ich ein Stück Code, der den Benutzer auf einem gewissen Zustand umleiten muss und weiterhin den normalen Ablauf, wenn nicht:Django umleiten und bricht Stromfluss

# entry point of the request 
def MyView(request): 
    object = MyAuth(request) 
    # do stuff with object 

    return render('some_template.html') 


def MyAuth(request): 
    if some_condition is True: 
     return redirect('url') 

    return object 

Aber es scheint, dass die Umleitung erfolgt nicht, wie Ich habe die Vorlage jedes Mal gerendert.

Warum unterbricht die Umleitung den Stromfluss nicht?

Ich habe versucht, einige Tests hinzuzufügen und den Ablauf der Methoden zu ändern, aber ich verstehe immer noch nicht, warum die Umleitung die aktuelle Anfrage nicht stoppen würde.

+1

Was immer Sie von 'MyAuth (request) zurückgeben, wird in dem' Objekt' gespeichert, das wiederum überhaupt nicht zurückgegeben wird. – AKS

+0

OK, wenn ich meine Redirect-Anweisung nicht zurückgebe, wird sie stattdessen ausgeführt? – nobe4

+0

Anstatt eine Antwort von 'MyAuth' zurückzugeben, könnten Sie eine Ausnahme auslösen und sie in' MyView' abfangen und dann zur URL umleiten. Wenn Sie 'MyAuth' nicht erneut verwenden müssen, würde ich vorschlagen, alles nur in' MyView' zu schreiben. – AKS

Antwort

0

Sie könnten die Art der object überprüfen und zurück entsprechend (diese Antwort durch die Diskussion in den Kommentaren über folgt).

def MyView(request): 
    object = MyAuth(request) 

    # if it is a redirect then return it. 
    if isinstance(object, HttpResponseRedirect): 
     return object 

    # do stuff with object 

    return render('some_template.html') 
+0

Bitte fügen Sie auch einen relevanten Kommentar hinzu, wenn Sie die Antwort ablehnen. – AKS

+0

Event, wenn es funktioniert, finde ich es ziemlich verwirrend, da MyAuth verschiedene Arten von Objekten zurückgibt. Wenn MyAuth immer auf die gleiche URL umleitet, wenn eine Bedingung übereinstimmt, dann geben Sie in MyAuth einfach None zurück, überprüfen Sie den Wert des zurückgegebenen Objekts in MyView und ob None in die URL umgeleitet wird. – Marc

+0

Das ist ein guter Punkt. Allerdings habe ich diese Antwort hinzugefügt, weil Sie die Implementierung von 'MyAuth' sehr hartnäckig befolgten, denn wenn Sie sich meine Kommentare von gestern ansehen, schlug ich auch vor, dass Sie eine Exception werfen und sie in' MyView' abfangen können, wenn Ihre Bedingung nicht erfüllt ist . Was ich versuche zu sagen ist, dass es mehrere Möglichkeiten gibt, wie Sie das tun könnten. Die Antwort hier berücksichtigt nur Ihre aktuelle Implementierung mit minimalen Änderungen möglich. Und wie ich schon früher vorgeschlagen habe, wenn Sie nur den Zustand überprüfen müssen, können Sie das alles nur in 'MyView' machen. – AKS