Spaces:
Runtime error
Runtime error
| import starlette.responses | |
| from shiny import * | |
| app_ui = ui.page_fluid( | |
| ui.markdown( | |
| """ | |
| ## Sticky load balancing test | |
| The purpose of this app is to determine if HTTP requests made by the client are | |
| correctly routed back to the same Python process where the session resides. It | |
| is only useful for testing deployments that load balance traffic across more | |
| than one Python process. | |
| If this test fails, it means that sticky load balancing is not working, and | |
| certain Shiny functionality (like file upload/download or server-side selectize) | |
| are likely to randomly fail. | |
| """ | |
| ), | |
| ui.tags.div( | |
| {"class": "card"}, | |
| ui.tags.div( | |
| {"class": "card-body font-monospace"}, | |
| ui.tags.div("Attempts: ", ui.tags.span("0", id="count")), | |
| ui.tags.div("Status: ", ui.tags.span(id="status")), | |
| ui.output_ui("out"), | |
| ), | |
| ), | |
| ) | |
| def server(input: Inputs, output: Outputs, session: Session): | |
| def out(): | |
| # Register a dynamic route for the client to try to connect to. | |
| # It does nothing, just the 200 status code is all that the client | |
| # will care about. | |
| url = session.dynamic_route( | |
| "test", | |
| lambda req: starlette.responses.PlainTextResponse( | |
| "OK", headers={"Cache-Control": "no-cache"} | |
| ), | |
| ) | |
| # Send JS code to the client to repeatedly hit the dynamic route. | |
| # It will succeed if and only if we reach the correct Python | |
| # process. | |
| return ui.tags.script( | |
| f""" | |
| const url = "{url}"; | |
| const count_el = document.getElementById("count"); | |
| const status_el = document.getElementById("status"); | |
| let count = 0; | |
| async function check_url() {{ | |
| count_el.innerHTML = ++count; | |
| try {{ | |
| const resp = await fetch(url); | |
| if (!resp.ok) {{ | |
| status_el.innerHTML = "Failure!"; | |
| return; | |
| }} else {{ | |
| status_el.innerHTML = "In progress"; | |
| }} | |
| }} catch(e) {{ | |
| status_el.innerHTML = "Failure!"; | |
| return; | |
| }} | |
| if (count === 100) {{ | |
| status_el.innerHTML = "Test complete"; | |
| return; | |
| }} | |
| setTimeout(check_url, 10); | |
| }} | |
| check_url(); | |
| """ | |
| ) | |
| app = App(app_ui, server) | |