2015-05-07 59 views
7

我在Flask上有一个项目。当我在Flask应用中包含Blueprint时,我有错误。代码来自一本关于Flask的书,Miguel Grinberg。Flask register_blueprint error(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 

客运行处理输出

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

非常感谢!我将错误路由移动到create_app def,并且一切都很好! –

10

我只是遇到了另一个我正在重构使用蓝图的应用程序的相同问题。没有必要使用解决方法,因为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 

格林贝格的书,瓶Web开发 - 一个优秀的读取 - 使用此装饰有关main蓝图登记错误页面。您可以查看配套代码here。我最初也错过了。 :P