我们正在将Flask应用程序从基于函数的视图迁移到可插入视图,除了错误处理程序之外,所有这些都按预期工作。我试图将所有错误处理程序放在一个名为error_handlers.py的模块中,并将其导入主模块。但它没有用。 尝试在谷歌搜索并按照相同的方式找到一些Git回购,但它不适合我,请帮我解决这个问题。
app
|
|__ __init__.py
|__ routing.py (which has the app=Flask(__name__) and imported error handlers here [import error_handlers])
|__ views.py
|__ error_handlers.py (Ex: @app.errorhandler(FormDataException)def form_error(error):return jsonify({'error': error.get_message()})
|__ API (api modules)
|
|
|__ __init__.py
|__ user.py
我正在使用Python 2.6和Flask 0.10.1。
答案 0 :(得分:9)
虽然您可以使用某些circular imports来执行此操作,例如:
app.py
import flask
app = flask.Flask(__name__)
import error_handlers
error_handlers.py
from app import app
@app.errorhandler(404)
def handle404(e):
return '404 handled'
显然,在更复杂的情况下,这可能会变得棘手。
Flask有一种干净而灵活的方式来组合来自多个模块的应用程序,这是blueprints的概念。要使用flask.Blueprint
注册错误处理程序,您可以使用以下任一方法:
flask.Blueprint.errorhandler
decorator处理本地蓝图错误
flask.Blueprint.app_errorhandler
装饰器处理全局应用程序错误。
示例:
error_handlers.py
import flask
blueprint = flask.Blueprint('error_handlers', __name__)
@blueprint.app_errorhandler(404)
def handle404(e):
return '404 handled'
app.py
import flask
import error_handlers
app = flask.Flask(__name__)
app.register_blueprint(error_handlers.blueprint)
两种方式都是相同的,取决于哪种方式更适合你。
答案 1 :(得分:0)
我认为您在error_handlers
中导入routing.py
模块就像
import error_handlers
最好像routing.py
from error_handlers import *
它可以帮到你: - )
答案 2 :(得分:0)
@NaturalBornCamper说他出错了。我不得不谷歌一下,但这是我现在最后的目的。我试图回复他的评论,但是我没有足够的声誉。
我的解决方案遵循蓝图路径,并且每个蓝图都有自己的模板和静态文件夹。
我在src/app/blueprints/errors/handlers.py
下有它
from flask import Blueprint
bp = Blueprint('errors',
__name__,
template_folder='templates',
static_folder='static', )
@bp.app_errorhandler(404)
def handle404(error):
return '404 handled'
在src/app/blueprints/errors/__init__.py
的初始化中包含以下内容:
from .handlers import bp as errors_bp
如果您希望蓝图处理其自身的错误,您可以这样做:
@bp.errorhandler()
但是据我了解,这不会出现一些错误,因为蓝图路线的注册方式不同,因此其行为可能与您期望的不同。
这是我作为src/app/__init__.py
下的工厂应用程序所拥有的
from flask import Flask
def create_app():
from app.blueprints.personal import personal_bp
from app.blueprints.errors import errors_bp
app = Flask(__name__, instance_relative_config=True)
app.register_blueprint(personal_bp, url_prefix='/') # blueprint for my personal site set to the default route
app.register_blueprint(errors_bp)
return app
然后我运行以下命令以测试/src
的烧瓶:
> export FLASK_APP=app
> export FLASK_APP=development
> flask run