|
3 | 3 | import os |
4 | 4 | from logging.handlers import RotatingFileHandler |
5 | 5 |
|
6 | | -from flask import Flask, render_template, request |
| 6 | +from flask import Flask, jsonify, render_template, request |
7 | 7 | from flask_bootstrap import Bootstrap |
8 | 8 | from flask_limiter import Limiter |
9 | 9 | from flask_limiter.util import get_remote_address |
@@ -73,21 +73,33 @@ def create_app(config_name="default"): |
73 | 73 | # Also log when endpoints are getting hit hard |
74 | 74 | limiter.logger.addHandler(file_handler) |
75 | 75 |
|
76 | | - @app.errorhandler(404) |
77 | | - def page_not_found(e): |
78 | | - return render_template("404.html"), 404 |
79 | | - |
80 | | - @app.errorhandler(403) |
81 | | - def forbidden(e): |
82 | | - return render_template("403.html"), 403 |
83 | | - |
84 | | - @app.errorhandler(500) |
85 | | - def internal_error(e): |
86 | | - return render_template("500.html"), 500 |
| 76 | + # Define error handlers |
| 77 | + def create_errorhandler(code, error, template): |
| 78 | + """ |
| 79 | + Create an error handler that returns a JSON or a template response |
| 80 | + based on the request "Accept" header. |
| 81 | + :param code: status code to handle |
| 82 | + :param error: response error message, if JSON |
| 83 | + :param template: template response |
| 84 | + """ |
87 | 85 |
|
88 | | - @app.errorhandler(429) |
89 | | - def rate_exceeded(e): |
90 | | - return render_template("429.html"), 429 |
| 86 | + def _handler_method(e): |
| 87 | + if request.accept_mimetypes.best == "application/json": |
| 88 | + return jsonify(error=error), code |
| 89 | + return render_template(template), code |
| 90 | + |
| 91 | + return _handler_method |
| 92 | + |
| 93 | + error_handlers = [ |
| 94 | + (403, "Forbidden", "403.html"), |
| 95 | + (404, "Not found", "404.html"), |
| 96 | + (413, "File too large", "413.html"), |
| 97 | + (429, "Too many requests", "429.html"), |
| 98 | + (500, "Internal Server Error", "500.html"), |
| 99 | + ] |
| 100 | + for code, error, template in error_handlers: |
| 101 | + # Pass generated errorhandler function to @app.errorhandler decorator |
| 102 | + app.errorhandler(code)(create_errorhandler(code, error, template)) |
91 | 103 |
|
92 | 104 | # create jinja2 filter for titles with multiple capitals |
93 | 105 | @app.template_filter("capfirst") |
|
0 commit comments