Flask register_blueprint 错误 (Python)
Flask register_blueprint error (Python)
我有一个关于 Flask 的项目。当我在我的 Flask 应用程序中包含 Blueprint 时,我遇到了错误。代码来自一本关于 Flask 的书,Miguel Grinberg。
项目树:
.
├── 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')
您不能在蓝图上创建 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)
我只是 运行 遇到了与我正在重构以使用蓝图的另一个应用程序相同的问题。不需要解决方法,因为 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
Grinberg 的书,Flask Web Development——一本优秀的读物——使用这个装饰器来注册在 main
蓝图上的错误页面。您可以查看配套代码 here。我一开始也错过了。 :P
我有一个关于 Flask 的项目。当我在我的 Flask 应用程序中包含 Blueprint 时,我遇到了错误。代码来自一本关于 Flask 的书,Miguel Grinberg。
项目树:
.
├── 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')
您不能在蓝图上创建 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)
我只是 运行 遇到了与我正在重构以使用蓝图的另一个应用程序相同的问题。不需要解决方法,因为 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
Grinberg 的书,Flask Web Development——一本优秀的读物——使用这个装饰器来注册在 main
蓝图上的错误页面。您可以查看配套代码 here。我一开始也错过了。 :P