mirror of
https://github.com/simonw/datasette.git
synced 2025-12-10 16:51:24 +01:00
/-/ alternative URL for homepage, closes #2393
This commit is contained in:
parent
bf953628bb
commit
93067668fe
5 changed files with 33 additions and 1 deletions
|
|
@ -1476,6 +1476,8 @@ class Datasette:
|
||||||
routes.append((regex, view))
|
routes.append((regex, view))
|
||||||
|
|
||||||
add_route(IndexView.as_view(self), r"/(\.(?P<format>jsono?))?$")
|
add_route(IndexView.as_view(self), r"/(\.(?P<format>jsono?))?$")
|
||||||
|
add_route(IndexView.as_view(self), r"/-/(\.(?P<format>jsono?))?$")
|
||||||
|
add_route(permanent_redirect("/-/"), r"/-$")
|
||||||
# TODO: /favicon.ico and /-/static/ deserve far-future cache expires
|
# TODO: /favicon.ico and /-/static/ deserve far-future cache expires
|
||||||
add_route(favicon, "/favicon.ico")
|
add_route(favicon, "/favicon.ico")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,10 @@
|
||||||
|
|
||||||
{% block title %}{{ metadata.title or "Datasette" }}: {% for database in databases %}{{ database.name }}{% if not loop.last %}, {% endif %}{% endfor %}{% endblock %}
|
{% block title %}{{ metadata.title or "Datasette" }}: {% for database in databases %}{{ database.name }}{% if not loop.last %}, {% endif %}{% endfor %}{% endblock %}
|
||||||
|
|
||||||
|
{% block extra_head %}
|
||||||
|
{% if noindex %}<meta name="robots" content="noindex">{% endif %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block body_class %}index{% endblock %}
|
{% block body_class %}index{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
|
||||||
|
|
@ -152,8 +152,9 @@ class IndexView(BaseView):
|
||||||
extra_links = await await_me_maybe(hook)
|
extra_links = await await_me_maybe(hook)
|
||||||
if extra_links:
|
if extra_links:
|
||||||
homepage_actions.extend(extra_links)
|
homepage_actions.extend(extra_links)
|
||||||
|
alternative_homepage = request.path == "/-/"
|
||||||
return await self.render(
|
return await self.render(
|
||||||
["index.html"],
|
["default:index.html" if alternative_homepage else "index.html"],
|
||||||
request=request,
|
request=request,
|
||||||
context={
|
context={
|
||||||
"databases": databases,
|
"databases": databases,
|
||||||
|
|
@ -166,5 +167,6 @@ class IndexView(BaseView):
|
||||||
"top_homepage", self.ds, request
|
"top_homepage", self.ds, request
|
||||||
),
|
),
|
||||||
"homepage_actions": homepage_actions,
|
"homepage_actions": homepage_actions,
|
||||||
|
"noindex": request.path == "/-/",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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 <https://global-power-plants.datasettes.com/.json>`_
|
* `global-power-plants.datasettes.com/.json <https://global-power-plants.datasettes.com/.json>`_
|
||||||
* `register-of-members-interests.datasettes.com/.json <https://register-of-members-interests.datasettes.com/.json>`_
|
* `register-of-members-interests.datasettes.com/.json <https://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 <customization_custom_templates>`. The ``/-/`` page will always render the default Datasette ``index.html`` template.
|
||||||
|
|
||||||
.. _DatabaseView:
|
.. _DatabaseView:
|
||||||
|
|
||||||
Database
|
Database
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
from bs4 import BeautifulSoup as Soup
|
from bs4 import BeautifulSoup as Soup
|
||||||
|
from datasette.app import Datasette
|
||||||
from datasette.utils import allowed_pragmas
|
from datasette.utils import allowed_pragmas
|
||||||
from .fixtures import ( # noqa
|
from .fixtures import ( # noqa
|
||||||
app_client,
|
app_client,
|
||||||
|
|
@ -51,6 +52,27 @@ def test_homepage(app_client_two_attached_databases):
|
||||||
] == table_links
|
] == 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 '<meta name="robots" content="noindex">' 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
|
@pytest.mark.asyncio
|
||||||
async def test_http_head(ds_client):
|
async def test_http_head(ds_client):
|
||||||
response = await ds_client.head("/")
|
response = await ds_client.head("/")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue