1
0

run.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import inspect
  2. import logging
  3. import os
  4. import sys
  5. import webbrowser
  6. from typing import List, Optional
  7. import uvicorn
  8. from uvicorn.main import STARTUP_FAILURE
  9. from uvicorn.supervisors import ChangeReload, Multiprocess
  10. from . import globals
  11. def run(*,
  12. host: str = '0.0.0.0',
  13. port: int = 8080,
  14. title: str = 'NiceGUI',
  15. favicon: Optional[str] = None,
  16. dark: Optional[bool] = False,
  17. binding_refresh_interval: float = 0.1,
  18. show: bool = True,
  19. reload: bool = True,
  20. uvicorn_logging_level: str = 'warning',
  21. uvicorn_reload_dirs: str = '.',
  22. uvicorn_reload_includes: str = '*.py',
  23. uvicorn_reload_excludes: str = '.*, .py[cod], .sw.*, ~*',
  24. exclude: str = '',
  25. ) -> None:
  26. globals.host = host
  27. globals.port = port
  28. globals.reload = reload
  29. globals.title = title
  30. globals.favicon = favicon
  31. globals.dark = dark
  32. globals.binding_refresh_interval = binding_refresh_interval
  33. globals.excludes = [e.strip() for e in exclude.split(',')]
  34. if inspect.stack()[-2].filename.endswith('spawn.py'):
  35. return
  36. if show:
  37. webbrowser.open(f'http://{host if host != "0.0.0.0" else "127.0.0.1"}:{port}/')
  38. def split_args(args: str) -> List[str]:
  39. return [a.strip() for a in args.split(',')]
  40. # NOTE: The following lines are basically a copy of `uvicorn.run`, but keep a reference to the `server`.
  41. config = uvicorn.Config(
  42. 'nicegui:app' if reload else globals.app,
  43. host=host,
  44. port=port,
  45. reload=reload,
  46. reload_includes=split_args(uvicorn_reload_includes) if reload else None,
  47. reload_excludes=split_args(uvicorn_reload_excludes) if reload else None,
  48. reload_dirs=split_args(uvicorn_reload_dirs) if reload else None,
  49. log_level=uvicorn_logging_level,
  50. )
  51. globals.server = uvicorn.Server(config=config)
  52. if (reload or config.workers > 1) and not isinstance(config.app, str):
  53. logging.warning('You must pass the application as an import string to enable "reload" or "workers".')
  54. sys.exit(1)
  55. if config.should_reload:
  56. sock = config.bind_socket()
  57. ChangeReload(config, target=globals.server.run, sockets=[sock]).run()
  58. elif config.workers > 1:
  59. sock = config.bind_socket()
  60. Multiprocess(config, target=globals.server.run, sockets=[sock]).run()
  61. else:
  62. globals.server.run()
  63. if config.uds:
  64. os.remove(config.uds) # pragma: py-win32
  65. if not globals.server.started and not config.should_reload and config.workers == 1:
  66. sys.exit(STARTUP_FAILURE)