2016-11-21 6 views
3

Ich stieß auf ein seltsames Problem (vielleicht nicht so seltsam für erfahrene in Kolben).Bestellung der Registrierung Flask Blueprints

Ich habe eine Flasche Anwendung

im Rahmen der Google App Engine dev_appserver.py läuft ich

# rest_server.py 

rest_api = Blueprint('rest_api', __name__) 
app = Flask(__name__) 
app.register_blueprint(rest_api, url_prefix='/api') # [1] DOESN'T WORK 

@rest_api.route("/") 
def hello(): 
    return "Hello World" 

app.register_blueprint(rest_api, url_prefix="/api") # [2] WORKS AS EXPECTED 

Ich habe folgend in meinem app.yaml

einen Plan in meiner Kolbe Anwendung habe

Wenn ich localhost: 8080/api/triff, wenn ich Blaupause an Position [1] registriere, bekomme ich eine Fehlermeldung, dass es keinen passenden Endpunkt gibt.

Allerdings, wenn ich bluerpint bei [2] registrieren, jede Position after der Dekorateur, funktioniert es.

Muss der Blueprint nach allen Dekoratoren registriert werden?

Antwort

-1

Obwohl Sie Ihren Entwurf registriert haben, ist er nicht registriert!
der Punkt ist, dass die Anwendung nicht bewusst Existenz ist rest_server.py

Sie haben es in der gleichen Datei zu registrieren, in dem Sie den folgenden Code haben:

app = Flask(__name__) 

Dies Ihr Problem lösen soll.



würde Ich mag das Muster zeigen Pläne mit ich verwende.
(Es ist für eine bessere Organisation des Codes nützlich) :

Blueprint-Muster
Ihre Anwendung kann so aussehen:

/yourapplication 
    runserver.py 
    /application #your application is a package containing some blueprints! 
     __init__.py 
     models.py 
     /hello #(blueprint name) 
      __init__.py 
      views_file1.py 
      views_file2.py 

Ihre runserver.py sollte wie folgt aussehen:

# runserver.py 

from application import app 
app.run() 


In diesem Beispiel ist hallo ein Paket und ein Ihre Pläne:

# application/hello/__init__.py 
from flask import Blueprint 
hello = Blueprint('main', __name__) 
# import views of this blueprint: 
from application.hello import views_file1, views_file2 


Import und Ihre Pläne in application/__ init__.py registrieren. Ihre application/__ init__.py sollte wie folgt aussehen:

# application/__init__.py 

from flask import Flask 
from .hello import hello as hello_blueprint 

app = Flask(__name__) 
app.register_blueprint(hello_blueprint) 
from application.models import * #your models (classes, or *) 
0

Ja, es ist erforderlich Pläne registrieren erst, nachdem alle ihre Routen erklärt wurden, zumindest, wenn Sie diese Routen verwenden möchten. (Wenn es Ihnen nichts ausmacht, dass die Routen nicht verfügbar sind, sieht es nicht so aus, als würde es nach der Registrierung des Blueprints tatsächlich Probleme geben, neue Routen zu deklarieren.)

Wenn Sie wissen wollen, warum: Blueprint-URL-Regeln sind nur in der Anwendung registriert, wenn Flask.register_blueprint aufgerufen wird. Wenn Sie nach der Registrierung des Blueprints Routen hinzufügen, werden diese nur zur Liste der Aufgaben hinzugefügt, wenn der Blueprint registriert wird (Blueprint.deferred_functions). Sie werden nicht rückwirkend zu vorhandenen Anwendungen hinzugefügt, für die der Blueprint in der Vergangenheit registriert wurde.

Verwandte Themen