2015-05-07 2 views
7

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

дерево

Проект:

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

create_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 

список приложения/главная/__ init__.py

from flask import Blueprint 

main = Blueprint('main', __name__) 

from . import views, errors 

Passenger вывод строки

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. 

Мой приложение/главная/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 

Мои приложение/главная/views.py

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

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

Вы неправильно регистрируете обработчик ошибок в проекте. Отправьте полный код проекта. –

+0

Обновить вопрос. Смотри, пожалуйста. –

ответ

6

Вы не можете создать 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) 
+0

Спасибо вам большое! Я перемещаю свои ошибки в make_app def, и все было в порядке! –

10

I просто столкнулся с этой проблемой с другим приложением, которое я рефакторинг использовал для чертежей. Нет необходимости в обходном пути, так как Flask предлагает декоратор для такого случая: app_errorhandler. Он работает точно так же, как errorhandler тем, что он регистрирует маршрут ошибки для всего приложения, но работает с чертежами. Как так:

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 

книга Гринберга, Колба Веб-разработка - отличное чтение - использует этот декоратор для страниц ошибок, зарегистрированных на main плане. Вы можете просмотреть код компаньона here. Сначала я пропустил это. : P

Смежные вопросы