diff --git a/datasette/app.py b/datasette/app.py index 1f9e9d3009..8f69ee9881 100644 --- a/datasette/app.py +++ b/datasette/app.py @@ -1476,6 +1476,8 @@ def add_route(view, regex): routes.append((regex, view)) add_route(IndexView.as_view(self), r"/(\.(?Pjsono?))?$") + add_route(IndexView.as_view(self), r"/-/(\.(?Pjsono?))?$") + add_route(permanent_redirect("/-/"), r"/-$") # TODO: /favicon.ico and /-/static/ deserve far-future cache expires add_route(favicon, "/favicon.ico") diff --git a/datasette/templates/index.html b/datasette/templates/index.html index 6e95126ddc..a3595a39d8 100644 --- a/datasette/templates/index.html +++ b/datasette/templates/index.html @@ -2,6 +2,10 @@ {% block title %}{{ metadata.title or "Datasette" }}: {% for database in databases %}{{ database.name }}{% if not loop.last %}, {% endif %}{% endfor %}{% endblock %} +{% block extra_head %} +{% if noindex %}{% endif %} +{% endblock %} + {% block body_class %}index{% endblock %} {% block content %} diff --git a/datasette/views/index.py b/datasette/views/index.py index a3178f5331..63cc067d58 100644 --- a/datasette/views/index.py +++ b/datasette/views/index.py @@ -152,8 +152,9 @@ async def get(self, request): extra_links = await await_me_maybe(hook) if extra_links: homepage_actions.extend(extra_links) + alternative_homepage = request.path == "/-/" return await self.render( - ["index.html"], + ["default:index.html" if alternative_homepage else "index.html"], request=request, context={ "databases": databases, @@ -166,5 +167,6 @@ async def get(self, request): "top_homepage", self.ds, request ), "homepage_actions": homepage_actions, + "noindex": request.path == "/-/", }, ) diff --git a/docs/pages.rst b/docs/pages.rst index 239c9f8027..78d5520fb3 100644 --- a/docs/pages.rst +++ b/docs/pages.rst @@ -23,6 +23,8 @@ Add ``/.json`` to the end of the URL for the JSON version of the underlying data * `global-power-plants.datasettes.com/.json `_ * `register-of-members-interests.datasettes.com/.json `_ +The index page can also be accessed at ``/-/``, useful for if the default index page has been replaced using an :ref:`index.html custom template `. The ``/-/`` page will always render the default Datasette ``index.html`` template. + .. _DatabaseView: Database diff --git a/tests/test_html.py b/tests/test_html.py index 5b60d2f544..d648bdf04e 100644 --- a/tests/test_html.py +++ b/tests/test_html.py @@ -1,4 +1,5 @@ from bs4 import BeautifulSoup as Soup +from datasette.app import Datasette from datasette.utils import allowed_pragmas from .fixtures import ( # noqa app_client, @@ -51,6 +52,27 @@ def test_homepage(app_client_two_attached_databases): ] == table_links +@pytest.mark.asyncio +@pytest.mark.parametrize("path", ("/", "/-/")) +async def test_homepage_alternative_location(path, tmp_path_factory): + template_dir = tmp_path_factory.mktemp("templates") + (template_dir / "index.html").write_text("Custom homepage", "utf-8") + datasette = Datasette(template_dir=str(template_dir)) + response = await datasette.client.get(path) + assert response.status_code == 200 + html = response.text + if path == "/": + assert html == "Custom homepage" + else: + assert '' in html + + +@pytest.mark.asyncio +async def test_homepage_alternative_redirect(ds_client): + response = await ds_client.get("/-") + assert response.status_code == 301 + + @pytest.mark.asyncio async def test_http_head(ds_client): response = await ds_client.head("/")