2014-02-12 12 views
7

Ich arbeite an einem erholsamen Service mit Flashruhe, und ich möchte sowohl Fabrikmuster und Blaupause in meinem Projekt nutzen. in app/__init__.py Ich habe eine create_app Funktion, um eine Flasche App zu erstellen und es an externe Anrufer zurückgeben, damit der Anrufer die App starten kann.Python Kolben-erholsamen Blueprint und Fabrik Muster arbeiten zusammen?

Innerhalb dieser Funktion wollte ich einen Blueprint registrieren, der auf das Implementierungspaket mit einer Präfix-URL verweist.

In app/resource/__init__.py wird Code folgende

from flask import current_app, Blueprint, render_template 
from flask.ext import restful 
resource = Blueprint('resource', __name__, url_prefix='/api') 

@resource.route('/') 
def index():  
    api = restful.Api(current_app) 
    from resource.HelloWorld import HelloWorld 
    api.add_resource(HelloWorld, '/hello') 

Mein Ziel ist es, dass ich /api/hello den Hello World Rest Service unter der URL zugreifen kann, aber ich weiß, dass der obige Code etwas falsch an einem Teil @resource.route('/') ... hat. Ich habe einen Fehler wie AssertionError: A setup function was called after the first request was handled. This usually indicates a bug in the app ... um api.add_resource(HelloWorld, '/hello'). Könnten Sie mir bitte ein paar Hinweise zum korrekten Vorgehen geben? Vielen Dank!

+0

ich ich denke, sollte einige Endpunkt s hinzufügen, aber ich weiß nicht, wie Direktressourcenanforderungen Rest gewünschten Endpunkt ... – jeffrey

Antwort

15

Flask-Restful, wie alle richtig Flask Erweiterungen implementiert, unterstützt zwei Methoden der selbst Registrierung:

  1. Mit der App bei Instanziierung (wie Sie versuchen, mit Api(current_app) zu tun) Zu einem späteren Zeitpunkt
  2. mit api.init_app(app)

die kanonische Weise mit dem Kreis Import Problem des Umgangs ist das zweite Muster zu verwenden und die instanzierte Erweiterung in Ihrer create_app Funktion importieren und registriert die Erweiterung der init_app Methode:

# app/resource/__init__.py 
from resource.hello_world import HelloWorld 

api = restful.Api(prefix='/api/v1') # Note, no app 
api.add_resource(HelloWorld, '/hello') 

# We could actually register our API on a blueprint 
# and then import and register the blueprint as normal 
# but that's an alternate we will leave for another day 
# bp = Blueprint('resource', __name__, url_prefix='/api') 
# api.init_app(bp) 

Und dann in Ihrem create_app Anruf Sie würden einfach die api laden und registrieren:

def create_app(): 
    # ... snip ... 
    # We import our extension 
    # and register it with our application 
    # without any circular references 
    # Our handlers can use `current_app`, as you already know 
    from app.resource import api 
    api.init_app(app) 
+2

ich habe Ausnahme ** Attribute: ‚nonetype‘ Objekt kein Attribut ‚config‘ hat ** bei 'self.app.config.get („ERROR_404_HELP“, True)' von flask_restful Paket beim Aufruf von 'abort (404)' in einer Ressource. Also wechsle ich nach den obigen Kommentaren zum Blueprint, was das Problem perfekt gelöst hat, danke! – jeffrey

+0

Ich rufe meine Blueprints an, nachdem ich meine Erweiterungen registriert habe, also werde ich nicht die Blueprint-Konfiguration haben, bevor ich init_app anrufe, ist das falsch? – nycynik

+0

Ich bin nicht 100% sicher, was Sie beschreiben, aber die Erstellung der Pläne nach der Registrierung von Erweiterungen ist sicherlich nicht falsch. –