2015-05-07 18 views
7

Ho un progetto su Flask. E quando includo Blueprint nella mia app Flask ho degli errori. Il codice è tratto da un libro, Miguel Grinberg su Flask.Errore flag_blueprint (Python) Flask

Progetto albero:

. 
├── 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 

lista app/main/__ init__.py

from flask import Blueprint 

main = Blueprint('main', __name__) 

from . import views, errors 

passeggeri uscita processo riga

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. 

mio 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 

mio 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

si sta registrando un gestore errori nel modello in modo errato. Si prega di inviare il codice completo del progetto. –

+0

Domanda di aggiornamento. Guarda per favore. –

risposta

6

Non è possibile creare un gestore su 500 un progetto.

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

Dovrete farlo sul principale dell'applicazione. Sento il tuo dolore, visto che hai una fabbrica di app e nessuna route nell'app /__ init__.py.

faccio di solito qualcosa di simile nei miei moduli di fabbrica app per gestire questa lacuna:

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 

e create_app (config_name), metodo factory app, mi chiamano:

register_errorhandlers(app) 
+0

Grazie mille! Sposto i miei errori in routing su create_app def, e tutto andava bene! –

10

I mi sono imbattuto in questo stesso problema con un'altra applicazione che stavo refactoring per usare le cianografie. Non c'è bisogno di una soluzione, dal momento che Flask offre un decoratore solo per un caso del genere: app_errorhandler. Funziona esattamente come errorhandler in quanto registra una route di errore per l'intera app, ma funziona con i blueprint. In questo modo:

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 

libro di Grinberg, Flask Sviluppo Web - una lettura eccellente - utilizza questa decoratore per le pagine di errore registrati sul main progetto. È possibile rivedere il codice complementare here. Anche all'inizio mi è mancato. : P

Problemi correlati