kopia lustrzana https://github.com/simonw/datasette
79 wiersze
2.3 KiB
Python
79 wiersze
2.3 KiB
Python
import json
|
|
from datasette.utils.asgi import Response
|
|
from .base import BaseView
|
|
from http.cookies import SimpleCookie
|
|
import secrets
|
|
|
|
|
|
class JsonDataView(BaseView):
|
|
name = "json_data"
|
|
|
|
def __init__(self, datasette, filename, data_callback, needs_request=False):
|
|
self.ds = datasette
|
|
self.filename = filename
|
|
self.data_callback = data_callback
|
|
self.needs_request = needs_request
|
|
|
|
async def get(self, request, as_format):
|
|
if self.needs_request:
|
|
data = self.data_callback(request)
|
|
else:
|
|
data = self.data_callback()
|
|
if as_format:
|
|
headers = {}
|
|
if self.ds.cors:
|
|
headers["Access-Control-Allow-Origin"] = "*"
|
|
return Response(
|
|
json.dumps(data),
|
|
content_type="application/json; charset=utf-8",
|
|
headers=headers,
|
|
)
|
|
|
|
else:
|
|
return await self.render(
|
|
["show_json.html"],
|
|
request=request,
|
|
context={
|
|
"filename": self.filename,
|
|
"data_json": json.dumps(data, indent=4),
|
|
},
|
|
)
|
|
|
|
|
|
class PatternPortfolioView(BaseView):
|
|
name = "patterns"
|
|
|
|
def __init__(self, datasette):
|
|
self.ds = datasette
|
|
|
|
async def get(self, request):
|
|
return await self.render(["patterns.html"], request=request)
|
|
|
|
|
|
class AuthTokenView(BaseView):
|
|
name = "auth_token"
|
|
|
|
def __init__(self, datasette):
|
|
self.ds = datasette
|
|
|
|
async def get(self, request):
|
|
token = request.args.get("token") or ""
|
|
if not self.ds._root_token:
|
|
return Response("Root token has already been used", status=403)
|
|
if secrets.compare_digest(token, self.ds._root_token):
|
|
self.ds._root_token = None
|
|
cookie = SimpleCookie()
|
|
cookie["ds_actor"] = self.ds.sign({"id": "root"}, "actor")
|
|
cookie["ds_actor"]["path"] = "/"
|
|
response = Response(
|
|
body="",
|
|
status=302,
|
|
headers={
|
|
"Location": "/",
|
|
"set-cookie": cookie.output(header="").lstrip(),
|
|
},
|
|
)
|
|
return response
|
|
else:
|
|
return Response("Invalid token", status=403)
|