mirror of
https://github.com/simonw/datasette.git
synced 2025-12-10 16:51:24 +01:00
AsgiRouter and AsgiView WIP
This commit is contained in:
parent
d4df640d18
commit
7cdc55c683
1 changed files with 62 additions and 1 deletions
|
|
@ -49,7 +49,68 @@ class DatasetteError(Exception):
|
||||||
self.messagge_is_html = messagge_is_html
|
self.messagge_is_html = messagge_is_html
|
||||||
|
|
||||||
|
|
||||||
class BaseView(HTTPMethodView):
|
class AsgiRouter:
|
||||||
|
def __init__(self, routes=None):
|
||||||
|
routes = routes or []
|
||||||
|
self.routes = [
|
||||||
|
# Compile any strings to regular expressions
|
||||||
|
(re.compile(pattern) if isinstance(pattern, str) else pattern, view)
|
||||||
|
for pattern, view in routes
|
||||||
|
]
|
||||||
|
|
||||||
|
async def __call__(self, scope, receive, send):
|
||||||
|
for regex, view in self.routes:
|
||||||
|
match = regex.match(scope["path"])
|
||||||
|
if match is not None:
|
||||||
|
new_scope = dict(scope, url_route={"kwargs": match.groupdict()})
|
||||||
|
return await view(new_scope, receive, send)
|
||||||
|
return await self.handle_404(scope, receive, send)
|
||||||
|
|
||||||
|
async def handle_404(self, scope, receive, send):
|
||||||
|
await send(
|
||||||
|
{
|
||||||
|
"type": "http.response.start",
|
||||||
|
"status": 404,
|
||||||
|
"headers": [[b"content-type", b"text/html"]],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
await send({"type": "http.response.body", "body": b"<h1>404</h1>"})
|
||||||
|
|
||||||
|
|
||||||
|
async def hello_world(scope, receive, send):
|
||||||
|
assert scope['type'] == 'http'
|
||||||
|
await send({
|
||||||
|
'type': 'http.response.start',
|
||||||
|
'status': 200,
|
||||||
|
'headers': [
|
||||||
|
[b'content-type', b'text/html'],
|
||||||
|
]
|
||||||
|
})
|
||||||
|
await send({
|
||||||
|
'type': 'http.response.body',
|
||||||
|
'body': b'<h1>Hello world!</h1>',
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
app = AsgiRouter([
|
||||||
|
('/hello/', hello_world),
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
class AsgiView(HTTPMethodView):
|
||||||
|
async def asgi(self, scope, receive, send):
|
||||||
|
# Uses scope to create a Sanic-compatible request object,
|
||||||
|
# then dispatches that to self.get(...) or self.options(...)
|
||||||
|
# along with keyword arguments that were already tucked
|
||||||
|
# into scope["url_route"]["kwargs"] by the router
|
||||||
|
# https://channels.readthedocs.io/en/latest/topics/routing.html#urlrouter
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class BaseView(AsgiView):
|
||||||
|
ds = None
|
||||||
|
|
||||||
def _asset_urls(self, key, template, context):
|
def _asset_urls(self, key, template, context):
|
||||||
# Flatten list-of-lists from plugins:
|
# Flatten list-of-lists from plugins:
|
||||||
seen_urls = set()
|
seen_urls = set()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue