github
html_url | issue_url | id | node_id | user | created_at | updated_at | author_association | body | reactions | issue | performed_via_github_app |
---|---|---|---|---|---|---|---|---|---|---|---|
https://github.com/simonw/datasette/issues/870#issuecomment-650842381 | https://api.github.com/repos/simonw/datasette/issues/870 | 650842381 | MDEyOklzc3VlQ29tbWVudDY1MDg0MjM4MQ== | 9599 | 2020-06-29T00:12:07Z | 2020-06-29T00:12:07Z | OWNER | I've made enough progress on this to be able to solve the messages issue in #864. I may still complete this overall goal (registering internal views with `register_routes()`) as part of Datasette 0.45 but it would be OK if it slipped to a later release. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 646737558 | |
https://github.com/simonw/datasette/issues/864#issuecomment-650842514 | https://api.github.com/repos/simonw/datasette/issues/864 | 650842514 | MDEyOklzc3VlQ29tbWVudDY1MDg0MjUxNA== | 9599 | 2020-06-29T00:12:59Z | 2020-06-29T00:12:59Z | OWNER | > I've made enough progress on this to be able to solve the messages issue in #864. I may still complete this overall goal (registering internal views with `register_routes()`) as part of Datasette 0.45 but it would be OK if it slipped to a later release. https://github.com/simonw/datasette/issues/870#issuecomment-650842381 | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 644309017 | |
https://github.com/simonw/datasette/issues/864#issuecomment-650846473 | https://api.github.com/repos/simonw/datasette/issues/864 | 650846473 | MDEyOklzc3VlQ29tbWVudDY1MDg0NjQ3Mw== | 9599 | 2020-06-29T00:39:04Z | 2020-06-29T00:39:04Z | OWNER | Re-opening: plugins may get to set messages but they don't display them, even if they render a template that extends `base.html`. For example, this code in a plugin: ```python return Response.html( await datasette.render_template( "write.html", {"databases": databases, "sql": request.args.get("sql") or ""}, request=request, ) ) ``` This won't display messages. The reason is that the messages are made available to the template context in the `BaseView.render()` method here: https://github.com/simonw/datasette/blob/7ac4936cec87f5a591e5d2680f0acefc3d35a705/datasette/views/base.py#L87-L95 | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 644309017 | |
https://github.com/simonw/datasette/issues/864#issuecomment-650846625 | https://api.github.com/repos/simonw/datasette/issues/864 | 650846625 | MDEyOklzc3VlQ29tbWVudDY1MDg0NjYyNQ== | 9599 | 2020-06-29T00:39:47Z | 2020-06-29T00:39:47Z | OWNER | I think the fix is to move the `"show_messages"` variable to here: https://github.com/simonw/datasette/blob/7ac4936cec87f5a591e5d2680f0acefc3d35a705/datasette/app.py#L735-L748 | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 644309017 | |
https://github.com/simonw/datasette/issues/864#issuecomment-650847013 | https://api.github.com/repos/simonw/datasette/issues/864 | 650847013 | MDEyOklzc3VlQ29tbWVudDY1MDg0NzAxMw== | 9599 | 2020-06-29T00:41:55Z | 2020-06-29T00:41:55Z | OWNER | To test this I'll need a plugin test that renders a custom template. Here's an example I can imitate: https://github.com/simonw/datasette/blob/7ac4936cec87f5a591e5d2680f0acefc3d35a705/tests/test_plugins.py#L588-L596 | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 644309017 | |
https://github.com/simonw/datasette/issues/805#issuecomment-650891257 | https://api.github.com/repos/simonw/datasette/issues/805 | 650891257 | MDEyOklzc3VlQ29tbWVudDY1MDg5MTI1Nw== | 9599 | 2020-06-29T03:56:48Z | 2020-06-29T03:56:48Z | OWNER | Using `datasette-glitch` and the new https://github.com/simonw/datasette-write - currently running on `datasette==0.45a4` - works on Glitch. The console shows a login link which gives you a cookie which allows you access to the `/-/write` interface. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 632724154 | |
https://github.com/simonw/datasette/issues/840#issuecomment-650891502 | https://api.github.com/repos/simonw/datasette/issues/840 | 650891502 | MDEyOklzc3VlQ29tbWVudDY1MDg5MTUwMg== | 9599 | 2020-06-29T03:58:08Z | 2020-06-29T03:58:08Z | OWNER | Step one: a "logout" page at `/-/logout` - which shows you a single CSRF-protected "logout" button if you do a GET against it and logs you out if you do a POST against it. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 637966833 | |
https://github.com/simonw/datasette/issues/840#issuecomment-650895874 | https://api.github.com/repos/simonw/datasette/issues/840 | 650895874 | MDEyOklzc3VlQ29tbWVudDY1MDg5NTg3NA== | 9599 | 2020-06-29T04:18:59Z | 2020-06-29T04:19:11Z | OWNER | Now just need the "Logged in as: XXX <logout>" navigation item. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 637966833 | |
https://github.com/simonw/datasette/issues/875#issuecomment-650898808 | https://api.github.com/repos/simonw/datasette/issues/875 | 650898808 | MDEyOklzc3VlQ29tbWVudDY1MDg5ODgwOA== | 9599 | 2020-06-29T04:32:31Z | 2020-06-29T04:33:30Z | OWNER | I could borrow the implementation for this from `datasette-auth-github` https://github.com/simonw/datasette-auth-github/blob/182298b034ecb647971b65057d1d3e7b7fbbb482/datasette_auth_github/templates/base.html ```html+jinja {% extends "default:base.html" %} {% block extra_head %} <style type="text/css"> .hd .logout { float: right; text-align: right; padding-left: 1em; } </style> {% endblock %} {% block nav %} {{ super() }} {% if auth and auth.username %} <p class="logout"> <strong>{{ auth.username }}</strong> · <a href="/-/logout">Log out</a> </p> {% endif %} {% endblock %} ``` | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 647103735 | |
https://github.com/simonw/datasette/issues/875#issuecomment-650899265 | https://api.github.com/repos/simonw/datasette/issues/875 | 650899265 | MDEyOklzc3VlQ29tbWVudDY1MDg5OTI2NQ== | 9599 | 2020-06-29T04:34:32Z | 2020-06-29T04:34:32Z | OWNER | From https://github.com/simonw/datasette/issues/840#issuecomment-643454625 > Another problem: what to display in the "you are logged in as", since we don't dictate an actor design. > > I'm going to use a includes template for this that can easily be over-ridden by administrators or by plugins. > > The default will look for the first available of the following keys: > > * display > * name > * username > * login > * id | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 647103735 | |
https://github.com/simonw/datasette/issues/873#issuecomment-650905399 | https://api.github.com/repos/simonw/datasette/issues/873 | 650905399 | MDEyOklzc3VlQ29tbWVudDY1MDkwNTM5OQ== | 9599 | 2020-06-29T05:01:03Z | 2020-06-29T05:01:03Z | OWNER | This is a bit tricky to fix. This change to uvicorn is relevant: https://github.com/encode/uvicorn/commit/a75fe1381f6b1f78901691c71894f3cf487b5d30 | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 647095487 | |
https://github.com/simonw/datasette/issues/873#issuecomment-650906318 | https://api.github.com/repos/simonw/datasette/issues/873 | 650906318 | MDEyOklzc3VlQ29tbWVudDY1MDkwNjMxOA== | 9599 | 2020-06-29T05:04:04Z | 2020-06-29T05:04:12Z | OWNER | Within uvicorn it does this: ```python if port == 0: port = server.sockets[0].getsockname()[1] ``` That `server` variable is later stashed here: ``` self.servers = [server] ``` Where `self` is the instance of `class Server` - which is the class that Uvicorn instantiates and calls `.run()` on when we do `uvicorn.run()` here: https://github.com/simonw/datasette/blob/35aee82c60b2c9a0185b934db5528c8bd11830f2/datasette/cli.py#L409 | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 647095487 | |
https://github.com/simonw/datasette/issues/873#issuecomment-650906533 | https://api.github.com/repos/simonw/datasette/issues/873 | 650906533 | MDEyOklzc3VlQ29tbWVudDY1MDkwNjUzMw== | 9599 | 2020-06-29T05:04:44Z | 2020-06-29T05:04:44Z | OWNER | The challenge is... can we run our own custom code after that line has executed that has access to `server` and can hence access `server.servers[0].sockets[0].getsockname()[1]` to find the port? | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 647095487 | |
https://github.com/simonw/datasette/issues/873#issuecomment-650907323 | https://api.github.com/repos/simonw/datasette/issues/873 | 650907323 | MDEyOklzc3VlQ29tbWVudDY1MDkwNzMyMw== | 9599 | 2020-06-29T05:07:16Z | 2020-06-29T05:07:16Z | OWNER | This line is interesting: is this a hook I can attach to somehow? ```python await self.lifespan.startup() ``` From https://github.com/encode/uvicorn/blob/a75fe1381f6b1f78901691c71894f3cf487b5d30/uvicorn/main.py#L475 | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 647095487 | |
https://github.com/simonw/datasette/issues/873#issuecomment-650908534 | https://api.github.com/repos/simonw/datasette/issues/873 | 650908534 | MDEyOklzc3VlQ29tbWVudDY1MDkwODUzNA== | 9599 | 2020-06-29T05:11:06Z | 2020-06-29T05:11:06Z | OWNER | Uvicorn's lifespan stuff isn't easy to figure out, but this test suite holds some clues: https://github.com/encode/uvicorn/blob/master/tests/test_lifespan.py | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 647095487 | |
https://github.com/simonw/datasette/issues/873#issuecomment-650908854 | https://api.github.com/repos/simonw/datasette/issues/873 | 650908854 | MDEyOklzc3VlQ29tbWVudDY1MDkwODg1NA== | 9599 | 2020-06-29T05:12:04Z | 2020-06-29T05:12:04Z | OWNER | Can I detect the port the server is running on from within the regular Datasette ASGI code? If so I could use that ability and maybe output the magic `--root` link a second after the server starts up somehow. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 647095487 | |
https://github.com/simonw/datasette/issues/873#issuecomment-650909136 | https://api.github.com/repos/simonw/datasette/issues/873 | 650909136 | MDEyOklzc3VlQ29tbWVudDY1MDkwOTEzNg== | 9599 | 2020-06-29T05:12:58Z | 2020-06-29T05:12:58Z | OWNER | On startup Datasette currently outputs: ``` INFO: Waiting for application startup. INFO: ASGI 'lifespan' protocol appears unsupported. INFO: Application startup complete. ``` So the ASGI lifespan protocol is almost certainly the right way to solve this. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 647095487 | |
https://github.com/simonw/datasette/issues/873#issuecomment-650909476 | https://api.github.com/repos/simonw/datasette/issues/873 | 650909476 | MDEyOklzc3VlQ29tbWVudDY1MDkwOTQ3Ng== | 9599 | 2020-06-29T05:14:08Z | 2020-06-29T05:14:08Z | OWNER | I already have a `AsgiLifespan` class: https://github.com/simonw/datasette/blob/35aee82c60b2c9a0185b934db5528c8bd11830f2/datasette/app.py#L896-L905 It runs this function: https://github.com/simonw/datasette/blob/35aee82c60b2c9a0185b934db5528c8bd11830f2/datasette/app.py#L890-L894 Could that startup function also output the `--root` login URL, if needed? | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 647095487 | |
https://github.com/simonw/datasette/issues/873#issuecomment-650910137 | https://api.github.com/repos/simonw/datasette/issues/873 | 650910137 | MDEyOklzc3VlQ29tbWVudDY1MDkxMDEzNw== | 9599 | 2020-06-29T05:16:32Z | 2020-06-29T05:16:32Z | OWNER | I'm not convinced that function is ever actually being called - I added a `print()` statement to it and it's not executing. I don't think the tests cover it. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 647095487 | |
https://github.com/simonw/datasette/issues/873#issuecomment-651193131 | https://api.github.com/repos/simonw/datasette/issues/873 | 651193131 | MDEyOklzc3VlQ29tbWVudDY1MTE5MzEzMQ== | 9599 | 2020-06-29T15:27:00Z | 2020-06-29T15:27:00Z | OWNER | Aha! Yes it's not being called, and the reason is this: https://github.com/encode/starlette/issues/486 Short version: by default an exception raised during that phase is silently swallowed! You can avoid the swallowing by adding `lifespan="on"` to the call to `uvicorn.run()`. When I did that here: `uvicorn.run(ds.app(), host=host, port=port, log_level="info", lifespan="on")` The server failed to start with this error: ``` INFO: Started server process [68849] INFO: Waiting for application startup. ERROR: Exception in 'lifespan' protocol Traceback (most recent call last): File ".../uvicorn/lifespan/on.py", line 48, in main await app(scope, self.receive, self.send) File ".../uvicorn/middleware/proxy_headers.py", line 45, in __call__ return await self.app(scope, receive, send) File ".../datasette_debug_asgi.py", line 9, in wrapped_app if scope["path"] == "/-/asgi-scope": KeyError: 'path' ``` | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 647095487 | |
https://github.com/simonw/datasette/issues/873#issuecomment-651193594 | https://api.github.com/repos/simonw/datasette/issues/873 | 651193594 | MDEyOklzc3VlQ29tbWVudDY1MTE5MzU5NA== | 9599 | 2020-06-29T15:27:46Z | 2020-06-29T15:27:46Z | OWNER | Uninstalling `datasette-debug-asgi` caused the server to startup correctly again. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 647095487 | |
https://github.com/simonw/datasette/issues/873#issuecomment-651203178 | https://api.github.com/repos/simonw/datasette/issues/873 | 651203178 | MDEyOklzc3VlQ29tbWVudDY1MTIwMzE3OA== | 9599 | 2020-06-29T15:44:38Z | 2020-06-29T15:44:54Z | OWNER | I'm having real trouble figuring out how to gain access to the port that was used to start the server. I'm treating this as a very low priority - it only affects the exact `-p 0 --root` combination which isn't going to affect many people at all. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 647095487 | |
https://github.com/simonw/datasette/issues/875#issuecomment-651293559 | https://api.github.com/repos/simonw/datasette/issues/875 | 651293559 | MDEyOklzc3VlQ29tbWVudDY1MTI5MzU1OQ== | 9599 | 2020-06-29T18:43:50Z | 2020-06-29T18:43:50Z | OWNER | <img width="470" alt="_memory_" src="https://user-images.githubusercontent.com/9599/86043599-ca4b0500-b9fd-11ea-9378-a053e96cfde7.png"> | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 647103735 | |
https://github.com/simonw/datasette/issues/805#issuecomment-651301202 | https://api.github.com/repos/simonw/datasette/issues/805 | 651301202 | MDEyOklzc3VlQ29tbWVudDY1MTMwMTIwMg== | 9599 | 2020-06-29T19:00:37Z | 2020-06-29T19:00:37Z | OWNER | How about a blog? Pre-configured canned queries that are only available to `"root"`, plus datasette-template-sql and default templates for the index page and blog entry pages. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 632724154 | |
https://github.com/simonw/datasette/issues/805#issuecomment-651302221 | https://api.github.com/repos/simonw/datasette/issues/805 | 651302221 | MDEyOklzc3VlQ29tbWVudDY1MTMwMjIyMQ== | 9599 | 2020-06-29T19:02:45Z | 2020-06-29T19:05:26Z | OWNER | No I prefer the idea that logged out users can still perform some writes, in a not-likely-to-attract-abuse way. So a root-user-can-configure-polls, logged-out-users-can-vote-in-them demo would be good. Or... crazy idea: a collaborative drawing program? A grid of cells of emoji, anyone can add an emoji to a cell. Would involve a bit of JavaScript. I could use https://github.com/joeattardi/emoji-button for this. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 632724154 |