Render templates/pages/x.html on 404 to /x - refs #648

This commit is contained in:
Simon Willison 2019-12-08 16:14:05 -08:00
commit c5e8cd84d3
2 changed files with 15 additions and 1 deletions

View file

@ -13,6 +13,7 @@ from pathlib import Path
import click import click
from markupsafe import Markup from markupsafe import Markup
from jinja2 import ChoiceLoader, Environment, FileSystemLoader, PrefixLoader from jinja2 import ChoiceLoader, Environment, FileSystemLoader, PrefixLoader
from jinja2.exceptions import TemplateNotFound
import uvicorn import uvicorn
from .views.base import DatasetteError, ureg, AsgiRouter from .views.base import DatasetteError, ureg, AsgiRouter
@ -658,7 +659,18 @@ class DatasetteRouter(AsgiRouter):
path += b"?" + scope["query_string"] path += b"?" + scope["query_string"]
await asgi_send_redirect(send, path.decode("latin1")) await asgi_send_redirect(send, path.decode("latin1"))
else: else:
await super().handle_404(scope, receive, send) # Is there a pages/* template matching this path?
template_path = os.path.join("pages", *scope["path"].split("/")) + ".html"
try:
template = self.ds.jinja_env.select_template([template_path])
except TemplateNotFound:
template = None
if template:
await asgi_send_html(
send, await template.render_async(), status=200
)
else:
await super().handle_404(scope, receive, send)
async def handle_500(self, scope, receive, send, exception): async def handle_500(self, scope, receive, send, exception):
title = None title = None

View file

@ -99,6 +99,8 @@ class AsgiRouter:
new_scope = dict(scope, url_route={"kwargs": match.groupdict()}) new_scope = dict(scope, url_route={"kwargs": match.groupdict()})
try: try:
return await view(new_scope, receive, send) return await view(new_scope, receive, send)
except NotFound:
return await self.handle_404(scope, receive, send)
except Exception as exception: except Exception as exception:
return await self.handle_500(scope, receive, send, exception) return await self.handle_500(scope, receive, send, exception)
return await self.handle_404(scope, receive, send) return await self.handle_404(scope, receive, send)