{"html_url": "https://github.com/simonw/datasette/issues/944#issuecomment-691788478", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/944", "id": 691788478, "node_id": "MDEyOklzc3VlQ29tbWVudDY5MTc4ODQ3OA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-09-14T03:21:45Z", "updated_at": "2020-09-14T03:21:45Z", "author_association": "OWNER", "body": "Having tried this out I think it does need a `raise_404()` mechanism - which needs to be smart enough to trigger the default 404 handler without accidentally going into an infinite loop.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 681516976, "label": "Path parameters for custom pages"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/944#issuecomment-691774262", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/944", "id": 691774262, "node_id": "MDEyOklzc3VlQ29tbWVudDY5MTc3NDI2Mg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-09-14T02:24:08Z", "updated_at": "2020-09-14T02:24:08Z", "author_association": "OWNER", "body": "Actually don't need `{{ raise_404(\"Museum not found\") }}` because we already have `{{ custom_status(404) }}`.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 681516976, "label": "Path parameters for custom pages"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/944#issuecomment-691769222", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/944", "id": 691769222, "node_id": "MDEyOklzc3VlQ29tbWVudDY5MTc2OTIyMg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-09-14T02:01:33Z", "updated_at": "2020-09-14T02:01:33Z", "author_association": "OWNER", "body": "I'm going to cache the `list_templates()` result in memory. If you want to add a new template-defined route you will need to restart the server. I think that's acceptable.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 681516976, "label": "Path parameters for custom pages"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/944#issuecomment-675830678", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/944", "id": 675830678, "node_id": "MDEyOklzc3VlQ29tbWVudDY3NTgzMDY3OA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-08-19T03:30:10Z", "updated_at": "2020-08-19T03:30:10Z", "author_association": "OWNER", "body": "These templates will need a way to raise a 404 - so that if the template itself is deciding if the page exists (for example using `datasette-template-sql` or the proposed `datasette.get()` method from #943 or the `graphql()` template function in https://github.com/simonw/datasette-graphql/issues/50) it can return a regular 404 page.\r\n\r\nThis can imitate the `custom_redirect()` function from https://docs.datasette.io/en/stable/custom_templates.html#custom-redirects:\r\n```html+jinja\r\n{{ custom_redirect(\"https://github.com/simonw/datasette\", 301) }}\r\n```\r\nIt could be as simple as this:\r\n```\r\n{{ raise_404(\"Museum not found\") }}\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 681516976, "label": "Path parameters for custom pages"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/944#issuecomment-675829942", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/944", "id": 675829942, "node_id": "MDEyOklzc3VlQ29tbWVudDY3NTgyOTk0Mg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-08-19T03:27:25Z", "updated_at": "2020-08-19T03:27:25Z", "author_association": "OWNER", "body": "I created a template file called `templates/pages/museums/{slug}.html` and used the debugger to see if Jinja could see it. This worked:\r\n```\r\n(Pdb) self.ds.jinja_env.list_templates()\r\n['500.html', '_codemirror.html', '_codemirror_foot.html', '_description_source_license.html', '_footer.html',\r\n'_table.html', 'allow_debug.html', 'base.html', 'database.html', 'default:500.html', 'default:_codemirror.html',\r\n'default:_codemirror_foot.html', 'default:_description_source_license.html', 'default:_footer.html',\r\n'default:_table.html', 'default:allow_debug.html', 'default:base.html', 'default:database.html',\r\n'default:index.html', 'default:logout.html', 'default:messages_debug.html', 'default:patterns.html',\r\n'default:permissions_debug.html', 'default:query.html', 'default:row.html', 'default:show_json.html',\r\n'default:table.html', 'forbidden.html', 'index.html', 'logout.html', 'messages_debug.html',\r\n'pages/about.html', 'pages/museums/{slug}.html', 'patterns.html', 'permissions_debug.html',\r\n'query.html', 'row.html', 'show_json.html', 'table.html']\r\n```\r\nThe `pages/museums/{slug}.html` template is in that list.\r\n\r\nHere's the implementation of that `list_templates()` method - it does some filesystem walking so it may be a bit expensive to run it on every request: https://github.com/pallets/jinja/blob/ca8b0b0287e320fe1f4a74f36910ef7ae3303d99/src/jinja2/loaders.py#L197-L212\r\n\r\nBut caching it would be pretty easy - either until the server is restarted or as an in-memory cache for a few seconds.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 681516976, "label": "Path parameters for custom pages"}, "performed_via_github_app": null}