1

我试图让我的自定义错误处理程序在引发异常时调用。我对 python/flask/werkzeug 有点陌生。我正在用 werkzeug DispatcherMiddleware 包装我的 api,并且似乎无法调用我的自定义处理程序。

管理.py

from werkzeug.serving import run_simple
from werkzeug.wsgi import DispatcherMiddleware


from myapp import api, web


app = DispatcherMiddleware(web.create_app(), {
    '/api': api.create_app()
})


if __name__ == '__main__':
  run_simple('0.0.0.0', 5000, app, use_reloader=True, use_debugger=True)

api/初始化.py

def create_app(settings_override=None):

  app = Flask(__name__)
  api = Api(app)

  # Set default encoder
  app.json_encoder = JSONEncoder

  # Register custom error handlers
  app.errorhandler(BaseErrorException)(on_error)
  app.errorhandler(BaseFormException)(on_formerror)
  app.errorhandler(404)(on_404)

  db.init_app(app)

  api_urls(api)

  return app


def on_error(e):
  print 'on_error'
  return jsonify(dict(error=e.msg)), 400


def on_formerror(e):
  print 'on_formerror'
  return jsonify(dict(errors=e.errors)), 400


def on_404(e):
  print 'on_404'
  return jsonify(dict(error='Not found')), 404

但我不断得到:

{
    "status": 500,
    "message": "Internal Server Error"
}

控制台输出:

Traceback (most recent call last):
...
raise BaseFormException(form.errors)
BaseFormException
4

2 回答 2

0

在 create_app 函数中,更改:

app.errorhandler(BaseErrorException)(on_error)
app.errorhandler(BaseFormException)(on_formerror)
app.errorhandler(404)(on_404)

经过:

if not app.debug:
    for e in [500, 404, 403]:
        app.errorhandler(e)(handle_error)

函数句柄错误:

def handle_error(e):
    # return render_template('errors/403.html')
    # return render_template('errors/404.html') 
    return render_template('errors/500.html')

希望它有所帮助。

于 2015-09-03T15:50:19.210 回答
0

例如

@app.errorhandler(500)
def handle_500(error):
    error_msg = util.error_msg()
    logger.get("cgi-log").error(error_msg)

    if config.debug:
        return error

    msg = "system error"
    return ErrorResponse(msg).output(), 200

@app.errorhandler(Exception)
def handle_exception(error):
    error_msg = util.error_msg()
    logger.get("cgi-log").error(error_msg)

    if config.debug:
        return error

    msg = "system error"
    return ErrorResponse(msg).output(), 200

@app.errorhandler(404)
def page_not_found(error):
    return ErrorResponse('Not Found').output(), 404

@app.errorhandler(405)
def method_not_allow(error):
    return ErrorResponse(str(error)).output(), 405
于 2018-11-27T13:19:58.587 回答