فهرست منبع

introducing on_connect callback

Rodja Trappe 3 سال پیش
والد
کامیت
44ea4a9c28
2فایلهای تغییر یافته به همراه40 افزوده شده و 2 حذف شده
  1. 23 0
      main.py
  2. 17 2
      nicegui/elements/page.py

+ 23 - 0
main.py

@@ -443,6 +443,29 @@ with example(ui.open):
 
     ui.button('REDIRECT', on_click=lambda e: ui.open('/yet_another_page', e.socket))
 
+sessions = """### Sessions
+
+ui.page provides an optional on_connect parameter 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).
+It also enables you to identify sessions over [longer time spans by configuring cookies](https://justpy.io/tutorial/sessions/).
+"""
+
+with example(sessions):
+    from datetime import datetime
+
+    session_ids = []
+    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}')
+
+    with ui.page('/session_demo', on_connect=connection) as session_demo:
+        visits = ui.label()
+
+    ui.link('Visit session demo', session_demo)
 
 add_route = """### Route
 

+ 17 - 2
nicegui/elements/page.py

@@ -1,7 +1,9 @@
+import inspect
 import justpy as jp
-from typing import Optional
+from typing import Callable, Optional
 from pygments.formatters import HtmlFormatter
 from ..globals import config, page_stack, view_stack
+from starlette.requests import Request
 
 class Page(jp.QuasarPage):
 
@@ -12,6 +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,
                  ):
         """Page
 
@@ -32,6 +35,7 @@ class Page(jp.QuasarPage):
         self.dark = dark if dark is not ... else config.dark
         self.tailwind = True  # use Tailwind classes instead of Quasars
         self.css = css
+        self.on_connect = on_connect
         self.head_html += '''
             <script>
                 confirm = () => { setTimeout(location.reload.bind(location), 100); return false; };
@@ -42,7 +46,18 @@ class Page(jp.QuasarPage):
         self.view.add_page(self)
 
         self.route = route
-        jp.Route(route, lambda: self)
+        jp.Route(route, self.access)
+
+    def access(self, request: Request):
+        if self.on_connect:
+            argcount = len(inspect.getargspec(self.on_connect)[0])
+            if argcount == 1:
+                self.on_connect(request)
+            elif argcount == 0:
+                self.on_connect()
+            else:
+                raise ValueError(f'invalid number of arguments (0 or 1 allowed, got {argcount})')
+        return self
 
     def __enter__(self):
         page_stack.append(self)