nicegui.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. # isort:skip_file
  2. from typing import Awaitable, Callable
  3. if True: # NOTE: prevent formatter from mixing up these lines
  4. import builtins
  5. print_backup = builtins.print
  6. builtins.print = lambda *args, **kwargs: kwargs.get('flush') and print_backup(*args, **kwargs)
  7. from .ui import Ui # NOTE: before justpy
  8. import justpy as jp
  9. builtins.print = print_backup
  10. from . import binding, globals
  11. from .page import create_page_routes, init_auto_index_page
  12. from .task_logger import create_task
  13. from .timer import Timer
  14. jp.app.router.on_startup.clear() # NOTE: remove JustPy's original startup function
  15. @jp.app.on_event('startup')
  16. async def patched_justpy_startup():
  17. jp.WebPage.loop = jp.asyncio.get_event_loop()
  18. jp.JustPy.loop = jp.WebPage.loop
  19. jp.JustPy.STATIC_DIRECTORY = jp.os.environ["STATIC_DIRECTORY"]
  20. print(f'NiceGUI ready to go on {"https" if jp.SSL_KEYFILE else "http"}://{jp.HOST}:{jp.PORT}')
  21. @jp.app.on_event('startup')
  22. def startup():
  23. init_auto_index_page()
  24. create_page_routes()
  25. globals.tasks.extend(create_task(t.coro, name=t.name) for t in Timer.prepared_coroutines)
  26. Timer.prepared_coroutines.clear()
  27. globals.tasks.extend(create_task(t, name='startup task')
  28. for t in globals.startup_handlers if isinstance(t, Awaitable))
  29. [safe_invoke(t) for t in globals.startup_handlers if isinstance(t, Callable)]
  30. jp.run_task(binding.loop())
  31. @jp.app.on_event('shutdown')
  32. def shutdown():
  33. [create_task(t, name='shutdown task') for t in globals.shutdown_handlers if isinstance(t, Awaitable)]
  34. [safe_invoke(t) for t in globals.shutdown_handlers if isinstance(t, Callable)]
  35. [t.cancel() for t in globals.tasks]
  36. def safe_invoke(func: Callable):
  37. try:
  38. result = func()
  39. if isinstance(result, Awaitable):
  40. create_task(result)
  41. except:
  42. globals.log.exception(f'could not invoke {func}')
  43. app = globals.app = jp.app
  44. ui = Ui()