diff --git a/incorporealcms/__init__.py b/incorporealcms/__init__.py index 45ceb25..726eaa3 100644 --- a/incorporealcms/__init__.py +++ b/incorporealcms/__init__.py @@ -45,7 +45,10 @@ def create_app(instance_path=None, test_config=None): return send_from_directory(os.path.join(app.instance_path, app.config['MEDIA_DIR']), filename) - from . import pages + from . import error_pages, pages app.register_blueprint(pages.bp) + app.register_error_handler(400, error_pages.bad_request) + app.register_error_handler(404, error_pages.page_not_found) + app.register_error_handler(500, error_pages.internal_server_error) return app diff --git a/incorporealcms/error_pages.py b/incorporealcms/error_pages.py new file mode 100644 index 0000000..5034fab --- /dev/null +++ b/incorporealcms/error_pages.py @@ -0,0 +1,17 @@ +"""Error page views for 400, 404, etc.""" +from incorporealcms.lib import render + + +def bad_request(error): + """Display 400 error messaging.""" + return render('400.html'), 400 + + +def internal_server_error(error): + """Display 500 error messaging.""" + return render('500.html'), 500 + + +def page_not_found(error): + """Display 404 error messaging.""" + return render('404.html'), 404 diff --git a/incorporealcms/templates/400.html b/incorporealcms/templates/400.html new file mode 100644 index 0000000..5f629bf --- /dev/null +++ b/incorporealcms/templates/400.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} + +{% block header %} +
+ {{ config.TITLE_SUFFIX }} +
+{% endblock %} + +{% block body %} +
+

BAD REQUEST

+

You're doing something you're not supposed to. Stop it?

+
+{% endblock %} diff --git a/incorporealcms/templates/404.html b/incorporealcms/templates/404.html new file mode 100644 index 0000000..bac3191 --- /dev/null +++ b/incorporealcms/templates/404.html @@ -0,0 +1,19 @@ +{% extends "base.html" %} + +{% block header %} +
+ {{ config.TITLE_SUFFIX }} +
+{% endblock %} + +{% block body %} +
+

NOT FOUND

+

Sorry, {{ request.path }} does not seem to exist, at least not anymore.

+

It's possible you followed a dead link on this site, in which case I would appreciate it if you could email me via: + bss @ <this domain> and I can take a look. I make an effort to symlink old content to its new location, + so old links and URLs should, generally speaking, work.

+

Otherwise, I suggest you go to the index and navigate your way (hopefully) to what + you're looking for.

+
+{% endblock %} diff --git a/incorporealcms/templates/500.html b/incorporealcms/templates/500.html new file mode 100644 index 0000000..68341a3 --- /dev/null +++ b/incorporealcms/templates/500.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} + +{% block header %} +
+ {{ config.TITLE_SUFFIX }} +
+{% endblock %} + +{% block body %} +
+

INTERNAL SERVER ERROR

+

Something bad happened! Please email me at bss @ <this domain> and tell me what happened.

+
+{% endblock %} diff --git a/incorporealcms/templates/base.html b/incorporealcms/templates/base.html index d2772ab..e15878f 100644 --- a/incorporealcms/templates/base.html +++ b/incorporealcms/templates/base.html @@ -12,6 +12,7 @@
+ {% block header %}
+ {% endblock %} + {% block body %}
{{ content }}
+ {% endblock %}
diff --git a/tests/functional_tests.py b/tests/functional_tests.py index bb6ef20..6353ac4 100644 --- a/tests/functional_tests.py +++ b/tests/functional_tests.py @@ -10,15 +10,24 @@ def test_page_that_exists(client): def test_page_that_doesnt_exist(client): - """Test that the app returns 404 for nonsense requests.""" + """Test that the app returns 404 for nonsense requests and they use my error page.""" response = client.get('/ohuesthaoeusth') assert response.status_code == 404 + assert b'/ohuesthaoeusth does not seem to exist' in response.data def test_files_outside_pages_do_not_get_served(client): - """Test that page pathing doesn't break out of the instance/pages/ dir.""" + """Test that page pathing doesn't break out of the instance/pages/ dir, and the error uses my error page.""" response = client.get('/../unreachable') assert response.status_code == 400 + assert b'You\'re doing something you\'re not supposed to. Stop it?' in response.data + + +def test_internal_server_error_serves_error_page(client): + """Test that various exceptions serve up the 500 page.""" + response = client.get('/actually-a-png') + assert response.status_code == 500 + assert b'INTERNAL SERVER ERROR' in response.data def test_weird_paths_do_not_get_served(client): diff --git a/tests/instance/pages/actually-a-png.md b/tests/instance/pages/actually-a-png.md new file mode 100644 index 0000000..c592d25 Binary files /dev/null and b/tests/instance/pages/actually-a-png.md differ