Refactored DatabaseDownload to database_download, closes #2116

pull/2121/head
Simon Willison 2023-07-26 11:43:55 -07:00
rodzic dc5171eb1b
commit 18dd88ee4d
2 zmienionych plików z 43 dodań i 42 usunięć

Wyświetl plik

@ -34,7 +34,7 @@ from jinja2.environment import Template
from jinja2.exceptions import TemplateNotFound from jinja2.exceptions import TemplateNotFound
from .views.base import ureg from .views.base import ureg
from .views.database import DatabaseDownload, DatabaseView, TableCreateView from .views.database import database_download, DatabaseView, TableCreateView
from .views.index import IndexView from .views.index import IndexView
from .views.special import ( from .views.special import (
JsonDataView, JsonDataView,
@ -1363,7 +1363,10 @@ class Datasette:
wrap_view(PatternPortfolioView, self), wrap_view(PatternPortfolioView, self),
r"/-/patterns$", r"/-/patterns$",
) )
add_route(DatabaseDownload.as_view(self), r"/(?P<database>[^\/\.]+)\.db$") add_route(
wrap_view(database_download, self),
r"/(?P<database>[^\/\.]+)\.db$",
)
add_route( add_route(
DatabaseView.as_view(self), r"/(?P<database>[^\/\.]+)(\.(?P<format>\w+))?$" DatabaseView.as_view(self), r"/(?P<database>[^\/\.]+)(\.(?P<format>\w+))?$"
) )

Wyświetl plik

@ -169,47 +169,45 @@ class DatabaseView(DataView):
) )
class DatabaseDownload(DataView): async def database_download(request, datasette):
name = "database_download" database = tilde_decode(request.url_vars["database"])
await datasette.ensure_permissions(
request.actor,
[
("view-database-download", database),
("view-database", database),
"view-instance",
],
)
try:
db = datasette.get_database(route=database)
except KeyError:
raise DatasetteError("Invalid database", status=404)
async def get(self, request): if db.is_memory:
database = tilde_decode(request.url_vars["database"]) raise DatasetteError("Cannot download in-memory databases", status=404)
await self.ds.ensure_permissions( if not datasette.setting("allow_download") or db.is_mutable:
request.actor, raise Forbidden("Database download is forbidden")
[ if not db.path:
("view-database-download", database), raise DatasetteError("Cannot download database", status=404)
("view-database", database), filepath = db.path
"view-instance", headers = {}
], if datasette.cors:
) add_cors_headers(headers)
try: if db.hash:
db = self.ds.get_database(route=database) etag = '"{}"'.format(db.hash)
except KeyError: headers["Etag"] = etag
raise DatasetteError("Invalid database", status=404) # Has user seen this already?
if db.is_memory: if_none_match = request.headers.get("if-none-match")
raise DatasetteError("Cannot download in-memory databases", status=404) if if_none_match and if_none_match == etag:
if not self.ds.setting("allow_download") or db.is_mutable: return Response("", status=304)
raise Forbidden("Database download is forbidden") headers["Transfer-Encoding"] = "chunked"
if not db.path: return AsgiFileDownload(
raise DatasetteError("Cannot download database", status=404) filepath,
filepath = db.path filename=os.path.basename(filepath),
headers = {} content_type="application/octet-stream",
if self.ds.cors: headers=headers,
add_cors_headers(headers) )
if db.hash:
etag = '"{}"'.format(db.hash)
headers["Etag"] = etag
# Has user seen this already?
if_none_match = request.headers.get("if-none-match")
if if_none_match and if_none_match == etag:
return Response("", status=304)
headers["Transfer-Encoding"] = "chunked"
return AsgiFileDownload(
filepath,
filename=os.path.basename(filepath),
content_type="application/octet-stream",
headers=headers,
)
class QueryView(DataView): class QueryView(DataView):