Flask/Flask_restful 自定义 404 错误消息
Flask/Flask_restful custom 404 error message
我有一个 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()
如果您想return自定义 404 错误页面,只需使用装饰器。
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404
要将错误记录到文件和 return JSON,而不是 HTML 模板,flask_restful 的 handle_error 方法可以被覆盖创建一个新的 Api class:
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')
对于 restful API,我会使用如下内容。在这种情况下,您不需要 呈现 HTML 模板。
此外,我建议 记录每个 404 事件,包括请求的 url 到:
- 修复您的路线(改善用户体验和 SEO)
- 检测黑客
import logging
from flask import request
@app.errorhandler(404)
def page_not_found(e):
# Even though Flask logs it by default,
# I prefer to have a logger dedicated to 404
logger.warning('404: {0}'.format(request.url))
return 'Not found', 404
我有一个 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()
如果您想return自定义 404 错误页面,只需使用装饰器。
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404
要将错误记录到文件和 return JSON,而不是 HTML 模板,flask_restful 的 handle_error 方法可以被覆盖创建一个新的 Api class:
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')
对于 restful API,我会使用如下内容。在这种情况下,您不需要 呈现 HTML 模板。
此外,我建议 记录每个 404 事件,包括请求的 url 到:
- 修复您的路线(改善用户体验和 SEO)
- 检测黑客
import logging
from flask import request
@app.errorhandler(404)
def page_not_found(e):
# Even though Flask logs it by default,
# I prefer to have a logger dedicated to 404
logger.warning('404: {0}'.format(request.url))
return 'Not found', 404