flask blueprint

flask - dash python



Error de register_blueprint de Flask(Python) (2)

No puede crear un controlador 500 en un blueprint.

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

Tendrás que hacerlo en la aplicación principal. Siento tu dolor, ya que tienes una fábrica de aplicaciones y no hay rutas en la aplicación / __ init__.py .

Por lo general, hago algo como esto en mis módulos de fábrica de aplicaciones para manejar esta deficiencia:

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

y en create_app (config_name), método de fábrica de aplicaciones, lo llamo:

register_errorhandlers(app)

Tengo un proyecto en Flask. Y cuando incluyo Blueprint en mi aplicación Flask, tengo errores. El código es de un libro, Miguel Grinberg sobre Flask.

Árbol de proyectos:

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

create_app () en la aplicación / __ 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 de aplicaciones / main / __ init__.py

from flask import Blueprint main = Blueprint(''main'', __name__) from . import views, errors

Salida del proceso de fila de pasajero

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.

Mi aplicación / 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

Mi aplicación / main / views.py

from flask import render_template, url_for, session, redirect from . import main @main.route(''/'') def index(): return render_template(''index.html'')


Me encontré con este mismo problema con otra aplicación que estaba refactorizando para usar planos. No hay necesidad de una solución alternativa, ya que Flask ofrece un decorador para ese caso: app_errorhandler . Funciona exactamente como el errorhandler de errorhandler que registra una ruta de error para toda la aplicación, pero funciona con planos. Al igual que:

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

El libro de Grinberg, Flask Web Development , una lectura excelente, utiliza este decorador para las páginas de error registradas en el anteproyecto main . Puede revisar el código complementario aquí . Lo perdí al principio, también. :PAG