datasette/datasette/views/special.py

79 wiersze
2.3 KiB
Python
Czysty Zwykły widok Historia

import json
from datasette.utils.asgi import Response
from .base import BaseView
from http.cookies import SimpleCookie
import secrets
class JsonDataView(BaseView):
2019-05-03 20:40:24 +00:00
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)