浏览代码

introducing globals.state. Fixes #100

Rodja Trappe 2 年之前
父节点
当前提交
8e403e12fa
共有 3 个文件被更改,包括 15 次插入1 次删除
  1. 10 0
      nicegui/globals.py
  2. 4 0
      nicegui/nicegui.py
  3. 1 1
      nicegui/page.py

+ 10 - 0
nicegui/globals.py

@@ -3,6 +3,7 @@ from __future__ import annotations
 import asyncio
 import logging
 from contextlib import contextmanager
+from enum import Enum
 from typing import TYPE_CHECKING, Awaitable, Callable, Dict, Generator, List, Optional, Union
 
 from starlette.applications import Starlette
@@ -16,9 +17,18 @@ if TYPE_CHECKING:
 
     from .page_builder import PageBuilder
 
+
+class State(Enum):
+    STOPPED = 0
+    STARTING = 1
+    STARTED = 2
+    STOPPING = 3
+
+
 app: Starlette
 config: Optional[Config] = None
 server: Optional[Server] = None
+state: State = State.STOPPED
 loop: Optional[asyncio.AbstractEventLoop] = None
 page_builders: Dict[str, 'PageBuilder'] = {}
 view_stacks: Dict[List['jp.HTMLBaseComponent']] = {}

+ 4 - 0
nicegui/nicegui.py

@@ -29,6 +29,7 @@ async def patched_justpy_startup():
 
 @jp.app.on_event('startup')
 def startup():
+    globals.state = globals.State.STARTING
     globals.loop = asyncio.get_running_loop()
     init_auto_index_page()
     create_page_routes()
@@ -39,13 +40,16 @@ def startup():
                          for t in globals.startup_handlers if isinstance(t, Awaitable))
     [safe_invoke(t) for t in globals.startup_handlers if isinstance(t, Callable)]
     jp.run_task(binding.loop())
+    globals.state = globals.State.STARTED
 
 
 @jp.app.on_event('shutdown')
 def shutdown():
+    globals.state = globals.State.STOPPING
     [create_task(t, name='shutdown task') for t in globals.shutdown_handlers if isinstance(t, Awaitable)]
     [safe_invoke(t) for t in globals.shutdown_handlers if isinstance(t, Callable)]
     [t.cancel() for t in globals.tasks]
+    globals.state = globals.State.STOPPED
 
 
 def safe_invoke(func: Callable):

+ 1 - 1
nicegui/page.py

@@ -196,7 +196,7 @@ class page:
                 await self.footer()
             return self.page
         builder = PageBuilder(decorated, self.shared)
-        if globals.server:
+        if globals.state != globals.State.STOPPED:
             builder.create_route(self.route)
         globals.page_builders[self.route] = builder
         return decorated