2017-12-29 31 views
3

In einem Dritt Rahmen zu verlieren Quellen Antwortfunktion wie folgt gewickelt:Fügen Sie einen zweiten Rückgabewert eine eingewickelt Funktion ohne Abwärtskompatibilität

from flask import Response 

def wrap_func(func): 
    def add_context(*args, **kwargs): 
     output_value = func(*args, **kwargs) 

     return Response(
      output_value 
     ) 

    return add_context 

und Entwickler können diese Dekorateur verwenden, um eine benutzerdefinierte Funktion etwas zu machen wie ein Einstiegspunkt:

@wrap_function 
def hello(): 
    return '<b>Hello</b>' 

Rahmen schafft eine Antwort und senden sie es, diese Funktionalität versteckt „unter der Haube“.

Und jetzt muss ich einige Response Parameter wie Cookies von meiner Funktion hello setzen. Da es ohne die Wrapper-Änderungen unmöglich zu sein scheint, habe ich beschlossen, zum Framework beizutragen.

Meine allererste war aber, einen optionalen Wert von Wrapped-Funktion (hello) mit Antwort-Parameter zurückgeben und dann innerhalb add_context zu analysieren. Beachten Sie, dass Rückwärtskompatibilität wichtig ist, "alte" Funktionen sollten genauso funktionieren wie "neu" mit Antwortparametern. Also, neben mit hello würde Wrapper Funktionen wie diese unterstützen:

@wrap_function 
def ping(): 
    return '<b>Hello</b>', {'cookies': [('te', 'st')]} 

Aber für mich ist es auf jeden Fall ein Hack Job. Vielleicht gibt es einige Best Practices, um eine solche Änderung zu implementieren, oder sogar einen besseren Ansatz, um die Rückgabe der Wrapped-Funktion zu modifizieren, ohne die Kompatibilität zu verlieren?

Antwort

0

Endlich habe ich beschlossen, es einfach und flexibel zu machen. Nun sollte die eingepackte Funktion wie üblich einen Abschlag zurückgeben oder Response Objekt mit initialisiert mit Abrisskörper. Und dann wurden innerhalb des Wrappers verschiedene Aktionen basierend auf isinstance ausgeführt.

from flask import Response 

def wrap_func(func): 
    def add_context(*args, **kwargs): 
     output_value = func(*args, **kwargs) 

     if isinstance(output_value, Response): 
      return output_value 
     else: 
      return Response(
       output_value 
      ) 

    return add_context 

Obwohl außerhalb dieses minimal Beispiel Wrapper Antworttext ändern muss, es funktioniert nach CustomResponse auf Response Basis zu schaffen und die Neudefinition erforderlichen Maßnahmen.

Verwandte Themen