From efbc78922dc379cecc95beef8d7e1badc49959a2 Mon Sep 17 00:00:00 2001 From: Akhil Lawrence Date: Thu, 23 Feb 2017 20:55:03 +0530 Subject: [PATCH] fixed error pages issue in _static_server --- mkdocs/commands/serve.py | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/mkdocs/commands/serve.py b/mkdocs/commands/serve.py index f2230b2f..4ab38378 100644 --- a/mkdocs/commands/serve.py +++ b/mkdocs/commands/serve.py @@ -1,21 +1,49 @@ from __future__ import unicode_literals + import logging import shutil import tempfile +from os.path import isfile, join from mkdocs.commands.build import build from mkdocs.config import load_config log = logging.getLogger(__name__) +def _get_handler(site_dir): + + from tornado.web import StaticFileHandler + from tornado.template import Loader + + class WebHandler(StaticFileHandler): + + def write_error(self, status_code, **kwargs): + + if status_code in (404, 500): + error_page = '{}.html'.format(status_code) + if isfile(join(site_dir, error_page)): + self.write(Loader(site_dir).load(error_page).generate()) + else: + super(WebHandler, self).write_error(status_code, **kwargs) + + return WebHandler + + def _livereload(host, port, config, builder, site_dir): # We are importing here for anyone that has issues with livereload. Even if # this fails, the --no-livereload alternative should still work. from livereload import Server - server = Server() + class LiveReloadServer(Server): + + def get_web_handlers(self, script): + handlers = super(LiveReloadServer, self).get_web_handlers(script) + handlers = handlers.pop() + return [(handlers[0], _get_handler(site_dir), handlers[2],)] + + server = LiveReloadServer() # Watch the documentation files, the config file and the theme files. server.watch(config['docs_dir'], builder) @@ -35,7 +63,7 @@ def _static_server(host, port, site_dir): from tornado import web application = web.Application([ - (r"/(.*)", web.StaticFileHandler, { + (r"/(.*)", _get_handler(site_dir), { "path": site_dir, "default_filename": "index.html" }),