kopia lustrzana https://github.com/simonw/datasette
Refactored DatabaseDownload to database_download, closes #2116
rodzic
dc5171eb1b
commit
18dd88ee4d
|
@ -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+))?$"
|
||||||
)
|
)
|
||||||
|
|
|
@ -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):
|
||||||
|
|
Ładowanie…
Reference in New Issue