register_output_renderer can now return Response, closes #953

This commit is contained in:
Simon Willison 2020-08-27 21:02:50 -07:00
commit 799ecae948
5 changed files with 42 additions and 16 deletions

View file

@ -1,4 +1,5 @@
from datasette import hookimpl
from datasette.utils.asgi import Response
import json
@ -56,6 +57,12 @@ def render_test_no_parameters():
return {"body": "Hello"}
async def render_response(request):
if request.args.get("_broken"):
return "this should break"
return Response.json({"this_is": "json"})
@hookimpl
def register_output_renderer(datasette):
return [
@ -65,4 +72,5 @@ def register_output_renderer(datasette):
"can_render": can_render,
},
{"extension": "testnone", "callback": render_test_no_parameters},
{"extension": "testresponse", "render": render_response},
]

View file

@ -559,6 +559,7 @@ def test_table_csv_json_export_interface(app_client):
"simple_primary_key.json?id__gt=2",
"simple_primary_key.testall?id__gt=2",
"simple_primary_key.testnone?id__gt=2",
"simple_primary_key.testresponse?id__gt=2",
"simple_primary_key.csv?id__gt=2&_size=max",
"#export",
]
@ -597,6 +598,7 @@ def test_csv_json_export_links_include_labels_if_foreign_keys(app_client):
"facetable.json?_labels=on",
"facetable.testall?_labels=on",
"facetable.testnone?_labels=on",
"facetable.testresponse?_labels=on",
"facetable.csv?_labels=on&_size=max",
"#export",
]

View file

@ -479,6 +479,18 @@ def test_hook_register_output_renderer_custom_headers(app_client):
assert "2" == response.headers["x-gosh"]
def test_hook_register_output_renderer_returning_response(app_client):
response = app_client.get("/fixtures/facetable.testresponse")
assert 200 == response.status
assert response.json == {"this_is": "json"}
def test_hook_register_output_renderer_returning_broken_value(app_client):
response = app_client.get("/fixtures/facetable.testresponse?_broken=1")
assert 500 == response.status
assert "this should break should be dict or Response" in response.text
def test_hook_register_output_renderer_can_render(app_client):
response = app_client.get("/fixtures/facetable?_no_can_render=1")
assert response.status == 200