我们可以在单独的模块中使用Flask错误处理程序

时间:2014-07-21 06:39:54

标签: python flask

我们正在将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。

3 个答案:

答案 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注册错误处理程序,您可以使用以下任一方法:

示例:

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