From 91568b03cd77fccc1e7690f2ca8359c7a0057dc1 Mon Sep 17 00:00:00 2001 From: Joe Cheng Date: Mon, 29 Jan 2024 11:59:47 -0800 Subject: [PATCH] Fix render.download not working in Express --- shiny/api-examples/download_button/app-express.py | 15 +++++++++++++++ shiny/express/_mock_session.py | 3 +++ shiny/render/_render.py | 2 +- 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 shiny/api-examples/download_button/app-express.py diff --git a/shiny/api-examples/download_button/app-express.py b/shiny/api-examples/download_button/app-express.py new file mode 100644 index 000000000..96bd64273 --- /dev/null +++ b/shiny/api-examples/download_button/app-express.py @@ -0,0 +1,15 @@ +import asyncio +import random +from datetime import date + +from shiny.express import render + + +@render.download( + filename=lambda: f"新型-{date.today().isoformat()}-{random.randint(100,999)}.csv" +) +async def downloadData(): + await asyncio.sleep(0.25) + yield "one,two,three\n" + yield "新,1,2\n" + yield "型,4,5\n" diff --git a/shiny/express/_mock_session.py b/shiny/express/_mock_session.py index 6eab21e9e..f9846f0b8 100644 --- a/shiny/express/_mock_session.py +++ b/shiny/express/_mock_session.py @@ -17,6 +17,9 @@ def __init__(self): self.input = Inputs({}) self.output = Outputs(cast(Session, self), self.ns, {}, {}) + def __bool__(self) -> bool: + return False + # This is needed so that Outputs don't throw an error. def _is_hidden(self, name: str) -> bool: return False diff --git a/shiny/render/_render.py b/shiny/render/_render.py index adb9cf6df..7079f75f1 100644 --- a/shiny/render/_render.py +++ b/shiny/render/_render.py @@ -688,7 +688,7 @@ def url() -> str: # not being None is because in Express, when the UI is rendered, this function # `render.download()()` called once before any sessions have been started. session = get_current_session() - if session is not None: + if session: session._downloads[self.output_id] = DownloadInfo( filename=self.filename, content_type=self.media_type,