Răsfoiți Sursa

code review

Falko Schindler 3 ani în urmă
părinte
comite
755a728b68
3 a modificat fișierele cu 24 adăugiri și 28 ștergeri
  1. 1 1
      README.md
  2. 10 10
      main.py
  3. 13 17
      nicegui/elements/page.py

+ 1 - 1
README.md

@@ -69,7 +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)
 - `reload`: automatically reload the ui on file changes (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
+- `on_connect`: default function or coroutine which is called for each new client connection; the optional `request` argument provides session infos
 - `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`)
 - `interactive`: used internally when run in interactive Python shell (default: `False`)

+ 10 - 10
main.py

@@ -9,7 +9,6 @@ import re
 import asyncio
 from nicegui.elements.html import Html
 from nicegui.elements.markdown import Markdown
-from nicegui.events import KeyEventArguments
 from nicegui.globals import page_stack
 
 # add docutils css to webpage
@@ -445,27 +444,28 @@ with example(ui.open):
 
 sessions = """### Sessions
 
-ui.page provides an optional on_connect parameter to register a callback.
+`ui.page` provides an optional `on_connect` argument to register a callback.
 It is invoked for each new connection to the page.
 
-The optional request parameter provides insights about the clients url parameters etc (see [the JustPy docs](https://justpy.io/tutorial/request_object/) for more details).
+The optional `request` argument provides insights about the clients url parameters etc. (see [the JustPy docs](https://justpy.io/tutorial/request_object/) for more details).
 It also enables you to identify sessions over [longer time spans by configuring cookies](https://justpy.io/tutorial/sessions/).
 """
-
 with example(sessions):
+    from collections import Counter
     from datetime import datetime
+    from starlette.requests import Request
 
-    session_ids = []
+    id_counter = Counter()
     creation = datetime.now().strftime('%H:%M, %d %B %Y')
 
-    def connection(request):
-        session_ids.append(request.session_id)
-        visits.set_text(f'{len(set(session_ids))} unique views ({len(session_ids)} over all) since {creation}')
+    def handle_connection(request: Request):
+        id_counter[request.session_id] += 1
+        visits.set_text(f'{len(id_counter)} unique views ({sum(id_counter.values())} overall) since {creation}')
 
-    with ui.page('/session_demo', on_connect=connection) as session_demo:
+    with ui.page('/session_demo', on_connect=handle_connection) as page:
         visits = ui.label()
 
-    ui.link('Visit session demo', session_demo)
+    ui.link('Visit session demo', page)
 
 add_route = """### Route
 

+ 13 - 17
nicegui/elements/page.py

@@ -1,9 +1,9 @@
 import inspect
 import justpy as jp
-from typing import Callable, Optional
+from typing import Awaitable, Callable, Optional, Union
 from pygments.formatters import HtmlFormatter
-from ..globals import config, page_stack, view_stack
 from starlette.requests import Request
+from ..globals import config, page_stack, view_stack
 
 class Page(jp.QuasarPage):
 
@@ -14,7 +14,7 @@ class Page(jp.QuasarPage):
                  dark: Optional[bool] = ...,
                  classes: str = 'q-ma-md column items-start',
                  css: str = HtmlFormatter().get_style_defs('.codehilite'),
-                 on_connect: Optional[Callable] = None,
+                 on_connect: Optional[Union[Awaitable, Callable]] = None,
                  ):
         """Page
 
@@ -26,6 +26,7 @@ class Page(jp.QuasarPage):
         :param dark: whether to use Quasar's dark mode (defaults to `dark` argument of `run` command)
         :param classes: tailwind classes for the container div (default: `'q-ma-md column items-start'`)
         :param css: CSS definitions
+        :param on_connect: optional function or coroutine which is called for each new client connection
         """
         super().__init__()
 
@@ -46,23 +47,18 @@ class Page(jp.QuasarPage):
         self.view.add_page(self)
 
         self.route = route
-        jp.Route(route, self.access)
+        jp.Route(route, self._route_function)
 
-    async def access(self, request: Request):
+    async def _route_function(self, request: Request):
         if self.on_connect:
-            argcount = len(inspect.getargspec(self.on_connect)[0])
-            if argcount == 1:
-                if inspect.iscoroutinefunction(self.on_connect):
-                    await self.on_connect(request)
-                else:
-                    self.on_connect(request)
-            elif argcount == 0:
-                if inspect.iscoroutinefunction(self.on_connect):
-                    await self.on_connect()
-                else:
-                    self.on_connect()
+            arg_count = len(inspect.signature(self.on_connect).parameters)
+            is_coro = inspect.iscoroutinefunction(self.on_connect)
+            if arg_count == 1:
+                await self.on_connect(request) if is_coro else self.on_connect(request)
+            elif arg_count == 0:
+                await self.on_connect() if is_coro else self.on_connect()
             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 {arg_count})')
         return self
 
     def __enter__(self):