Ошибка register_blueprint Flask (Python)

У меня есть проект на Flask. И когда я включаю Blueprint в свое приложение Flask, у меня возникают ошибки. Код взят из книги Мигеля Гринберга о Flask.

Дерево проекта:

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

create_app () в 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

перечисление app / main / __ init__.py

from flask import Blueprint

main = Blueprint('main', __name__)

from . import views, errors

Вывод процесса пассажирского ряда

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.

Мое 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

Мое 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')

person Artem Gavrilov    schedule 07.05.2015    source источник
comment
вы неправильно регистрируете обработчик ошибок в схеме. Пожалуйста, опубликуйте свой полный код чертежа.   -  person Robert Moskal    schedule 07.05.2015
comment
Обновить вопрос. Смотри пожалуйста.   -  person Artem Gavrilov    schedule 07.05.2015


Ответы (2)


Вы не можете создать обработчик 500 на чертеже.

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

Вам нужно будет сделать это в основном приложении. Я чувствую вашу боль, поскольку у вас есть фабрика приложений и нет маршрутов в app / __ init__.py.

Я обычно делаю что-то подобное в своих модулях фабрики приложений, чтобы справиться с этим недостатком:

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

а в create_app (config_name), метод фабрики приложений, я называю его:

register_errorhandlers(app)
person Robert Moskal    schedule 07.05.2015
comment
Большое спасибо! Я перемещаю свою маршрутизацию ошибок в create_app def, и все было хорошо! - person Artem Gavrilov; 07.05.2015