2016-04-07 8 views
0

Die Zeit ist gekommen, in der ich eine neue Version für meine API freigeben muss und die vorherige noch unterstütze.API Versionsverwaltung mit Blueprints verursacht Spalte

Ich folgte den Anweisungen in der angenommenen Antwort für this question. Leider habe ich nicht genug Rep in den Kommentaren dieser Antwort zu fragen.

Ich habe eine Struktur-Anwendung, die wie folgt aussieht:

+-- app/ 
    +-- api_2_0/ 
     +-- __init__.py 
     (...) 
    +-- api_2_1/ 
     +-- __init__.py 
     (...) 
    +-- __init__.py 

Beide sind Entwürfe, die ich auf diese Weise in meinem __init__.py im create_app Methode initialisieren (Ich verwende die app factory-Methode):

def create_app(config_name): 
    app = Flask(__name__) 

    (...) 

    from .api_2_0 import api as api_2_0_blueprint 
    app.register_blueprint(api_2_0_blueprint, url_prefix='/api/v2.0') 

    from .api_2_1 import api as api_2_1_blueprint 
    app.register_blueprint(api_2_1_blueprint, url_prefix='/api/v2.1') 

Aber diese Ursachen:

AssertionError: A blueprint's name collision occurred between <flask.blueprints.Blueprint object at 0x7f8e48e82c10> and <flask.blueprints.Blueprint object at 0x7f8e48ef7150>. Both share the same name "api". Blueprints that are created on the fly need unique names. 

Es stimmt, dass beide in ihren Ordnern api genannt werden, aber ich importiere sie mit anderen Namen. Alle Aufrufe an api in etwas anderes für jede Version umbenennen zu müssen, würde die Versionierung schmerzhaft machen und insgesamt zu einem Code-Durcheinander führen.

Gibt es einen besseren Weg, dies zu tun?

Antwort

0

Ok, es stellt sich heraus, dass ich nur die Blueprint-Definition ändern musste.

Bevor ich hatte beide Blaupausen als api = Blueprint('api', __name__) definiert, die die Kollision verursacht und ließ mich denken, dass ich den Namen der Variablen api ändern musste.

Es stellte sich heraus, was ich wirklich ändern musste, um nur die Zeichenfolge 'api' im Aufruf von Blueprint verwendet, so jetzt sind meine Pläne definiert als api = Blueprint('api_2_0', __name__) und api = Blueprint('api_2_1', __name__), so dass ich die Variable api die in beiden Fällen gleich zu halten und mich gerettet das Problem, es überall zu suchen.

Ich weiß jetzt, das war eine ziemlich dumme Frage, aber ich lasse das hier für den Fall, dass jemand mit dem gleichen Problem läuft.

+1

Um jedes Mal, wenn Sie '__name__' für beide Argumente verwenden könnten, das Durcheinander mit dieser bestimmten Zeichenfolge zu speichern, glaube ich. –

Verwandte Themen