More datasette.urls usage, refs #1025

This commit is contained in:
Simon Willison 2020-10-19 21:24:47 -07:00
commit 0d1763fb2f
6 changed files with 26 additions and 10 deletions

View file

@ -1158,7 +1158,7 @@ class DatasetteRouter:
await template.render_async(
dict(
info,
base_url=self.ds.config("base_url"),
urls=self.ds.urls,
app_css_hash=self.ds.app_css_hash(),
)
),
@ -1270,19 +1270,26 @@ class Urls:
def __init__(self, ds):
self.ds = ds
def path(self, path):
if path.startswith("/"):
path = path[1:]
return self.ds.config("base_url") + path
def instance(self):
return self.ds.config("base_url")
return self.path("")
def static(self, path):
return "{}-/static/{}".format(self.instance(), path)
return self.path("-/static/{}".format(path))
def logout(self):
return self.path("-/logout")
def database(self, database):
db = self.ds.databases[database]
base_url = self.ds.config("base_url")
if self.ds.config("hash_urls") and db.hash:
return "{}{}-{}".format(base_url, database, db.hash[:HASH_LENGTH])
return self.path("{}-{}".format(database, db.hash[:HASH_LENGTH]))
else:
return "{}{}".format(base_url, database)
return self.path(database)
def table(self, database, table):
return "{}/{}".format(self.database(database), urllib.parse.quote_plus(table))

View file

@ -35,7 +35,7 @@ p.message-warning {
<p>Use this tool to try out different actor and allow combinations. See <a href="https://docs.datasette.io/en/stable/authentication.html#defining-permissions-with-allow-blocks">Defining permissions with "allow" blocks</a> for documentation.</p>
<form action="/-/allow-debug" method="get">
<form action="{{ urls.path('-/allow-debug') }}" method="get">
<div class="two-col">
<p><label>Allow block</label></p>
<textarea name="allow">{{ allow_input }}</textarea>

View file

@ -2,7 +2,7 @@
<html>
<head>
<title>{% block title %}{% endblock %}</title>
<link rel="stylesheet" href="{{ base_url }}-/static/app.css?{{ app_css_hash }}">
<link rel="stylesheet" href="{{ urls.static('app.css') }}?{{ app_css_hash }}">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
{% for url in extra_css_urls %}
<link rel="stylesheet" href="{{ url.url }}"{% if url.sri %} integrity="{{ url.sri }}" crossorigin="anonymous"{% endif %}>
@ -18,7 +18,7 @@
{% if actor %}
<div class="logout">
<strong>{{ display_actor(actor) }}</strong>{% if show_logout %} &middot;
<form action="/-/logout" method="post">
<form action="{{ urls.logout() }}" method="post">
<input type="hidden" name="csrftoken" value="{{ csrftoken() }}">
<button class="button-as-link">Log out</button>
</form>{% endif %}

View file

@ -4,7 +4,7 @@
{% block nav %}
<p class="crumbs">
<a href="/">home</a>
<a href="{{ urls.instance() }}">home</a>
</p>
{{ super() }}
{% endblock %}

View file

@ -102,6 +102,7 @@ class DatabaseView(DataView):
return (
{
"database": database,
"path": self.ds.urls.database(database),
"size": db.size,
"tables": tables,
"hidden_count": len([t for t in tables if t["hidden"]]),

View file

@ -375,6 +375,14 @@ The ``datasette.urls`` object contains methods for building URLs to pages within
``datasette.urls.instance()``
Returns the URL to the Datasette instance root page. This is usually ``"/"``
``datasette.urls.path(path)``
Takes a path and returns the full path, taking ``base_url`` into account.
For example, ``datasette.urls.path("-/logout")`` will return the path to the logout page, which will be ``"/-/logout"`` by default or ``/prefix-path/-/logout`` if ``base_url`` is set to ``/prefix-path/``
``datasette.urls.logout()``
Returns the URL to the logout page, usually ``"/-/logout"``.
``datasette.urls.database(database_name)``
Returns the URL to a database page, for example ``"/fixtures"``