2016-04-01 12 views
1

Dank, was ich von this question gelernt, ich habe in der Lage gewesen, eine Flasche Login-Prozess mit einem Endpunkt wie folgt zu machen:Flask Login bricht, wenn meine Dekorateur Parameter akzeptiert

@app.route('/top_secret') 
@authorize 
@login_required 
def top_secret(): 
    return render_template("top_secret.html") 

und (bis jetzt) Pass-Through „autorisiert“ ein völlig Dekorateur:

from functools import wraps 

def authorize(func): 
    @wraps(func) 
    def newfunc(*args, **kwargs): 
     return func(*args, **kwargs) 
    return newfunc 

Der @wraps(func) Aufruf erlaubt Flask den Endpunkt zu finden, das es sucht. So weit, ist es gut.

Aber ich möchte einen Gruppennamen an den "authorize" -Prozess übergeben, und die Dinge gehen schlecht, wenn ich versuche, einen Dekorateur zu machen, der eingehende Parameter akzeptiert. Dies scheint die richtige Syntax zu sein, wenn ich nicht irre:

from functools import wraps 

def authorize(group=None): 
    def real_authorize(func): 
     @wraps(func) 
     def newfunc(*args, **kwargs): 
      return func(*args, **kwargs) 
     return newfunc 
    return real_authorize 

Aber noch einmal der Fehler erscheint als Flask nicht in der Lage ist, den 'top-secret' Endpunkt, um herauszufinden:

werkzeug.routing.BuildError: Could not build url for endpoint 'top_secret'. 

I dachte vielleicht, es brauchte @wraps(authorize) Dekoration direkt über def real_authorize(func), aber das half nichts zu helfen.

Kann mir jemand helfen herauszufinden, wo meine @wraps falsch läuft?

Antwort

0

Das Verzieren einer Funktion entspricht dem erneuten Binden des Namens an das Ergebnis des Aufrufs des Dekorators mit der Funktion.

@authorize 
def top_secret(): 
    ... 

# is equivalent to 

def top_secret(): 
    ... 
top_secret = authorize(top_secret) 

Die Funktion, die Sie geschrieben haben, ist ein Dekorateur Fabrik: Sie es nennen, mit einem optionalen Argumente, einen Dekorateur zu bekommen.

@authorize() 
def top_secret(): 
    ... 

# is equivalent to 

def top_secret(): 
    ... 
top_secret = authorize()(top_secret) 

Derzeit sind Sie top_secret als group Argument der Fabrik vorbei, so dass Sie nie wirklich eine Route zu erstellen. Da es keine Route gibt, gibt es auch keine URL zu bauen.

+0

Ah! Also, wenn ich dich richtig verstehe, bewirkte meine Dekoration eines nackten "@ authorize", dass es die "top_secret" -Funktion als Argument annahm? Ich sage es vielleicht nicht richtig, aber als ich die Dekoration in '@authorize ('mygroup')' 'oder auch nur' @authorize() 'änderte, schien das zu funktionieren. Verstehe ich deine Antwort richtig? –

Verwandte Themen