open.py 1.3 KB

123456789101112131415161718192021222324252627282930
  1. from typing import Callable, Optional, Union
  2. from justpy import WebPage
  3. from starlette.websockets import WebSocket
  4. from ..globals import find_route
  5. from ..task_logger import create_task
  6. def open(self, target: Union[Callable, str], socket: Optional[WebSocket] = None):
  7. """Open
  8. Can be used to programmatically trigger redirects for a specific client.
  9. Note that *all* clients (i.e. browsers) connected to the page will open the target URL *unless* a socket is specified.
  10. User events like button clicks provide such a socket.
  11. :param target: page function or string that is a an absolute URL or relative path from base URL
  12. :param socket: optional WebSocket defining the target client
  13. """
  14. create_task(open_async(self, target, socket), name='open_async')
  15. async def open_async(self, target: Union[Callable, str], socket: Optional[WebSocket] = None):
  16. path = target if isinstance(target, str) else find_route(target)[1:]
  17. sockets = [socket] if socket else [s for socket_dict in WebPage.sockets.values() for s in socket_dict.values()]
  18. for socket in sockets:
  19. if not path:
  20. path = ' ' # NOTE empty string seems to be transformed to "null" when sending
  21. await socket.send_json({'type': 'page_update', 'page_options': {'redirect': path}})