Flask / Flask_restful自定义404错误消息

时间:2017-09-21 15:27:58

标签: python python-3.x flask tornado flask-restful

我有一个flash / flask_result应用程序设置如下。如何向整个应用程序添加自定义全局404错误消息?我应该用龙卷风还是烧瓶?

from flask import Flask
from flask_cors import CORS
from flask_restful import Api
from flask_env import MetaFlaskEnv
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from tornado.wsgi import WSGIContainer

...

#setup api app
app = Flask(__name__)
app.config.from_object(Configuration)
API = Api(app)

# allow cross site request
CORS = CORS(app, resources={r"/api/*": {"origins": "*"}})

# system endpoints
API.add_resource(Version, '/api/version')
...

if __name__ == '__main__':
    # start server
    HTTP_SERVER = HTTPServer(WSGIContainer(app))
    HTTP_SERVER.listen(port=app.config["PORT"])
    IOLoop.instance().start()

3 个答案:

答案 0 :(得分:2)

如果您想要返回自定义404错误页面,请使用装饰器。

@app.errorhandler(404)
def page_not_found(e):
    return render_template('404.html'), 404

答案 1 :(得分:0)

要将错误记录到文件并返回JSON(而不是HTML模板),可以通过创建新的Api类来覆盖flask_restful的handle_error方法:

class MyApi(Api):
    def __init__(self, *args, **kwargs):
        super(MyApi, self).__init__(*args, **kwargs)
    def handle_error(self, e):
        if isinstance(e, HTTPException):
            if e.code == 404:
                log_msg = '[Web Server] %s returned %s: %s' % (request.path, e.code, e.name)
                logger.error(log_msg) # File logging configured separately (see below).  
        return super(MyApi, self).handle_error(e)

使用的文件日志记录将取决于环境;这里的软件使用Gunicorn:

import logging
logger = logging.getLogger('gunicorn.error')

答案 2 :(得分:0)

对于稳定的API ,我将使用类似以下的内容。在这种情况下,您不需要渲染 HTML模板

此外,我建议将包括请求的URL在内的每个404事件记录到:

  • 修正您的路线(提高用户体验和SEO)
  • 检测黑客
NetworkBehaviour