1
0
Эх сурвалжийг харах

adding async on_connect to config/ui.run

Rodja Trappe 3 жил өмнө
parent
commit
c3c50c55a8

+ 1 - 0
README.md

@@ -69,6 +69,7 @@ You can call `ui.run()` with optional arguments for some high-level configuratio
 - `dark`: whether to use Quasar's dark mode (default: `False`, use `None` for "auto" mode)
 - `dark`: whether to use Quasar's dark mode (default: `False`, use `None` for "auto" mode)
 - `reload`: automatically reload the ui on file changes (default: `True`)
 - `reload`: automatically reload the ui on file changes (default: `True`)
 - `show`: automatically open the ui in a browser tab (default: `True`)
 - `show`: automatically open the ui in a browser tab (default: `True`)
+- `on_connect`: default function or coroutine which is called for each new client connection; the optional request parameter provides session infos
 - `uvicorn_logging_level`: logging level for uvicorn server (default: `'warning'`)
 - `uvicorn_logging_level`: logging level for uvicorn server (default: `'warning'`)
 - `main_page_classes`: configure Quasar classes of main page (default: `q-ma-md column items-start`)
 - `main_page_classes`: configure Quasar classes of main page (default: `q-ma-md column items-start`)
 - `interactive`: used internally when run in interactive Python shell (default: `False`)
 - `interactive`: used internally when run in interactive Python shell (default: `False`)

+ 5 - 3
nicegui/config.py

@@ -1,11 +1,12 @@
-from pydantic import BaseModel
-from typing import Optional
+from dataclasses import dataclass
+from typing import Awaitable, Callable, Optional, Union
 import inspect
 import inspect
 import ast
 import ast
 import os
 import os
 from . import globals
 from . import globals
 
 
-class Config(BaseModel):
+@dataclass
+class Config():
     # NOTE: should be in sync with ui.run arguments
     # NOTE: should be in sync with ui.run arguments
     host: str = '0.0.0.0'
     host: str = '0.0.0.0'
     port: int = 8080
     port: int = 8080
@@ -14,6 +15,7 @@ class Config(BaseModel):
     dark: Optional[bool] = False
     dark: Optional[bool] = False
     reload: bool = True
     reload: bool = True
     show: bool = True
     show: bool = True
+    on_connect: Optional[Union[Callable, Awaitable]] = None
     uvicorn_logging_level: str = 'warning'
     uvicorn_logging_level: str = 'warning'
     main_page_classes: str = 'q-ma-md column items-start'
     main_page_classes: str = 'q-ma-md column items-start'
     interactive: bool = False
     interactive: bool = False

+ 10 - 4
nicegui/elements/page.py

@@ -35,7 +35,7 @@ class Page(jp.QuasarPage):
         self.dark = dark if dark is not ... else config.dark
         self.dark = dark if dark is not ... else config.dark
         self.tailwind = True  # use Tailwind classes instead of Quasars
         self.tailwind = True  # use Tailwind classes instead of Quasars
         self.css = css
         self.css = css
-        self.on_connect = on_connect
+        self.on_connect = on_connect or config.on_connect
         self.head_html += '''
         self.head_html += '''
             <script>
             <script>
                 confirm = () => { setTimeout(location.reload.bind(location), 100); return false; };
                 confirm = () => { setTimeout(location.reload.bind(location), 100); return false; };
@@ -48,13 +48,19 @@ class Page(jp.QuasarPage):
         self.route = route
         self.route = route
         jp.Route(route, self.access)
         jp.Route(route, self.access)
 
 
-    def access(self, request: Request):
+    async def access(self, request: Request):
         if self.on_connect:
         if self.on_connect:
             argcount = len(inspect.getargspec(self.on_connect)[0])
             argcount = len(inspect.getargspec(self.on_connect)[0])
             if argcount == 1:
             if argcount == 1:
-                self.on_connect(request)
+                if inspect.iscoroutinefunction(self.on_connect):
+                    await self.on_connect(request)
+                else:
+                    self.on_connect(request)
             elif argcount == 0:
             elif argcount == 0:
-                self.on_connect()
+                if inspect.iscoroutinefunction(self.on_connect):
+                    await self.on_connect()
+                else:
+                    self.on_connect()
             else:
             else:
                 raise ValueError(f'invalid number of arguments (0 or 1 allowed, got {argcount})')
                 raise ValueError(f'invalid number of arguments (0 or 1 allowed, got {argcount})')
         return self
         return self

+ 2 - 1
nicegui/run.py

@@ -1,4 +1,4 @@
-from typing import Optional
+from typing import Awaitable, Callable, Optional, Union
 import inspect
 import inspect
 import sys
 import sys
 import webbrowser
 import webbrowser
@@ -21,6 +21,7 @@ def run(self, *,
         dark: Optional[bool] = False,
         dark: Optional[bool] = False,
         reload: bool = True,
         reload: bool = True,
         show: bool = True,
         show: bool = True,
+        on_connect: Optional[Union[Callable, Awaitable]] = None,
         uvicorn_logging_level: str = 'warning',
         uvicorn_logging_level: str = 'warning',
         main_page_classes: str = 'q-ma-md column items-start',
         main_page_classes: str = 'q-ma-md column items-start',
         ):
         ):