html_url,issue_url,id,node_id,user,user_label,created_at,updated_at,author_association,body,reactions,issue,issue_label,performed_via_github_app https://github.com/simonw/datasette/issues/654#issuecomment-568276548,https://api.github.com/repos/simonw/datasette/issues/654,568276548,MDEyOklzc3VlQ29tbWVudDU2ODI3NjU0OA==,9599,simonw,2019-12-22T16:13:11Z,2019-12-22T16:13:11Z,OWNER,"Documentation: https://datasette.readthedocs.io/en/latest/config.html#template-debug Demos: * https://latest.datasette.io/?_context=1 * https://latest.datasette.io/fixtures?_context=1 * https://latest.datasette.io/fixtures/roadside_attractions?_context=1 ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",541467590,Template debug mode that outputs template context, https://github.com/simonw/datasette/issues/654#issuecomment-568274570,https://api.github.com/repos/simonw/datasette/issues/654,568274570,MDEyOklzc3VlQ29tbWVudDU2ODI3NDU3MA==,9599,simonw,2019-12-22T15:52:43Z,2019-12-22T15:52:43Z,OWNER,"One problem with this: what if secrets end up being dumped out in this debug view? This won't happen with default Datasette but could potentially happen with a plugin. This feature should be opt-in - maybe a `template_debug:1` config setting.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",541467590,Template debug mode that outputs template context, https://github.com/simonw/datasette/issues/654#issuecomment-568274520,https://api.github.com/repos/simonw/datasette/issues/654,568274520,MDEyOklzc3VlQ29tbWVudDU2ODI3NDUyMA==,9599,simonw,2019-12-22T15:51:58Z,2019-12-22T15:51:58Z,OWNER,"Proof of concept: ```diff diff --git a/datasette/views/base.py b/datasette/views/base.py index 5182479..39d1f77 100644 --- a/datasette/views/base.py +++ b/datasette/views/base.py @@ -1,6 +1,7 @@ import asyncio import csv import itertools +import json import re import time import urllib @@ -138,28 +139,31 @@ class BaseView(AsgiView): ) extra_template_vars.update(extra_vars) + template_context = { + **context, + **{ + ""app_css_hash"": self.ds.app_css_hash(), + ""select_templates"": select_templates, + ""zip"": zip, + ""body_scripts"": body_scripts, + ""extra_css_urls"": self._asset_urls( + ""extra_css_urls"", template, context + ), + ""extra_js_urls"": self._asset_urls( + ""extra_js_urls"", template, context + ), + ""format_bytes"": format_bytes, + ""database_url"": self.database_url, + ""database_color"": self.database_color, + }, + **extra_template_vars, + } + if request.args.get(""_context""): + return Response.html(""
{}
"".format( + escape(json.dumps(template_context, default=repr, indent=4)) + )) return Response.html( - await template.render_async( - { - **context, - **{ - ""app_css_hash"": self.ds.app_css_hash(), - ""select_templates"": select_templates, - ""zip"": zip, - ""body_scripts"": body_scripts, - ""extra_css_urls"": self._asset_urls( - ""extra_css_urls"", template, context - ), - ""extra_js_urls"": self._asset_urls( - ""extra_js_urls"", template, context - ), - ""format_bytes"": format_bytes, - ""database_url"": self.database_url, - ""database_color"": self.database_color, - }, - **extra_template_vars, - } - ) + await template.render_async(template_context) ) ```","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",541467590,Template debug mode that outputs template context,