2015-05-07 14 views
7

Ich habe ein Projekt auf Flask. Und wenn ich Blueprint in meine Flask-App einfüge, habe ich Fehler. Der Code stammt aus einem Buch, Miguel Grinberg über Flask.Flask register_blueprint error (Python)

Projektbaum:

. 
├── app 
│   ├── __init__.py 
│   ├── main 
│   │   ├── errors.py 
│   │   ├── __init__.py 
│   │   └── views.py 
│   ├── static 
│   │   ├── static_files 
│   └── templates 
│    └── html_files 
├── config.py 
├── manage.py 

create_app() in app/__ init__.py

def create_app(config_name): 
    app = Flask(__name__) 
    app.config.from_object(config[config_name]) 
    config[config_name].init_app(app) 
    bootstrap.init_app(app) 
    db.init_app(app) 

    from .main import main as main_blueprint 
    app.register_blueprint(main_blueprint) 

    return app 

Eintrag app/main/__ init__.py

from flask import Blueprint 

main = Blueprint('main', __name__) 

from . import views, errors 

Passagier Zeilenprozessausgabe

Traceback (most recent call last): 
    File "/opt/passenger/passenger-4.0.57/helper-scripts/wsgi-loader.py", line 320, in <module> 
    app_module = load_app() 
    File "/opt/passenger/passenger-4.0.57/helper-scripts/wsgi-loader.py", line 61, in load_app 
    return imp.load_source('passenger_wsgi', startup_file) 
    File "/home/m/mallts/dev.wget-studio.ru/myenv/lib/python3.4/imp.py", line 171, in load_source 
    module = methods.load() 
    File "<frozen importlib._bootstrap>", line 1220, in load 
    File "<frozen importlib._bootstrap>", line 1200, in _load_unlocked 
    File "<frozen importlib._bootstrap>", line 1129, in _exec 
    File "<frozen importlib._bootstrap>", line 1471, in exec_module 
    File "<frozen importlib._bootstrap>", line 321, in _call_with_frames_removed 
    File "passenger_wsgi.py", line 16, in <module> 
    from manage import app as application 
    File "/home/m/mallts/dev.wget-studio.ru/fikls/manage.py", line 7, in <module> 
    app = create_app('default') #(os.getenv('FLASK_CONFIG') or 'default') 
    File "/home/m/mallts/dev.wget-studio.ru/fikls/app/__init__.py", line 19, in create_app 
    app.register_blueprint(main_blueprint) 
    File "/home/m/mallts/dev.wget-studio.ru/myenv/lib/python3.4/site-packages/flask/app.py", line 62, in wrapper_func 
    return f(self, *args, **kwargs) 
    File "/home/m/mallts/dev.wget-studio.ru/myenv/lib/python3.4/site-packages/flask/app.py", line 889, in register_blueprint 
    blueprint.register(self, options, first_registration) 
    File "/home/m/mallts/dev.wget-studio.ru/myenv/lib/python3.4/site-packages/flask/blueprints.py", line 153, in register 
    deferred(state) 
    File "/home/m/mallts/dev.wget-studio.ru/myenv/lib/python3.4/site-packages/flask/blueprints.py", line 128, in wrapper 
    func(state) 
    File "/home/m/mallts/dev.wget-studio.ru/myenv/lib/python3.4/site-packages/flask/blueprints.py", line 399, in <lambda> 
    self.name, code_or_exception, f)) 
    File "/home/m/mallts/dev.wget-studio.ru/myenv/lib/python3.4/site-packages/flask/app.py", line 62, in wrapper_func 
    return f(self, *args, **kwargs) 
    File "/home/m/mallts/dev.wget-studio.ru/myenv/lib/python3.4/site-packages/flask/app.py", line 1090, in _register_error_handler 
    'It is currently not possible to register a 500 internal ' \ 
AssertionError: It is currently not possible to register a 500 internal server error on a per-blueprint level. 

Meine app/main/errors.py

from flask import render_template 
from . import main 

@main.errorhandler(404) 
def page_not_found(e): 
    return render_template('404.html'), 404 

@main.errorhandler(500) 
def internal_server_error(e): 
    return render_template('500.html'), 500 

Meine app/main/views.py

from flask import render_template, url_for, session, redirect 
from . import main 

@main.route('/') 
def index(): 
    return render_template('index.html') 
+0

Sie registrieren einen Fehlerhandler im Bauplan falsch. Bitte senden Sie Ihren vollständigen Blueprint-Code. –

+0

Frage aktualisieren. Schau bitte. –

Antwort

6

Sie können keine 500-Handler auf eine Blaupause.

https://www.bountysource.com/issues/1400879-can-not-register-a-500-error-handler-for-blueprint

Sie finden es auf der Hauptanwendung zu tun haben. Ich fühle jedoch deine Schmerzen, da du eine App-Fabrik und keine Routen in App/__ init__.py hast.

Normalerweise mache ich so etwas in meiner app Fabrik Module dieses Manko zu handhaben:

def register_errorhandlers(app): 
    def render_error(error): 
     error_code = getattr(error, 'code', 500) 
     return render_template("{0}.html".format(error_code)), error_code 

    for errcode in [500]: 
     app.errorhandler(errcode)(render_error) 
    return None 

und in create_app (config_name), App Factory-Methode, ich nenne es:

register_errorhandlers(app) 
+0

Vielen Dank! Ich verschiebe mein Fehler-Routing zu create_app def, und alles war in Ordnung! –

10

I Ich bin gerade auf dasselbe Problem mit einer anderen Anwendung gestoßen, die ich neu strukturiert habe, um Blueprints zu verwenden. Es gibt keine Notwendigkeit für eine Abhilfe, da Flask einen Dekorateur für genau solch einen Fall anbietet: app_errorhandler. Es funktioniert genau wie errorhandler in dem es eine Fehlerroute für die gesamte App registriert, aber es funktioniert mit Blaupausen. Wie so:

from flask import render_template 
from . import main 

@main.app_errorhandler(404) 
def page_not_found(e): 
    return render_template('404.html'), 404 

@main.app_errorhandler(500) 
def internal_server_error(e): 
    return render_template('500.html'), 500 

Grinberg Buch Flask Web Development - eine hervorragende Lese - verwendet diese Dekorateur für Fehlerseiten registriert auf dem main Entwurf. Sie können den Begleitcode here überprüfen. Ich habe es auch zuerst vermisst. : P