Selaa lähdekoodia

Merge pull request #1012 from awfulness/main

ability to set storage_secret for run_with
Rodja Trappe 1 vuosi sitten
vanhempi
säilyke
d453953ef5
4 muutettua tiedostoa jossa 28 lisäystä ja 12 poistoa
  1. 10 3
      examples/fastapi/frontend.py
  2. 14 0
      nicegui/helpers.py
  3. 1 9
      nicegui/run.py
  4. 3 0
      nicegui/run_with.py

+ 10 - 3
examples/fastapi/frontend.py

@@ -1,11 +1,18 @@
 from fastapi import FastAPI
 
-from nicegui import ui
+from nicegui import app, ui
 
 
-def init(app: FastAPI) -> None:
+def init(fastapi_app: FastAPI) -> None:
     @ui.page('/show')
     def show():
         ui.label('Hello, FastAPI!')
 
-    ui.run_with(app)
+        # NOTE dark mode will be persistent for each user across tabs and server restarts
+        ui.dark_mode().bind_value(app.storage.user, 'dark_mode')
+        ui.checkbox('dark mode').bind_value(app.storage.user, 'dark_mode')
+
+    ui.run_with(
+        fastapi_app,
+        storage_secret='pick your private secret here'  # NOTE setting a secret is optional but allows for persistent storage per user
+    )

+ 14 - 0
nicegui/helpers.py

@@ -9,6 +9,10 @@ import webbrowser
 from contextlib import nullcontext
 from typing import TYPE_CHECKING, Any, Awaitable, Callable, Optional, Tuple, Union
 
+from starlette.middleware import Middleware
+from starlette.middleware.sessions import SessionMiddleware
+
+from nicegui.storage import RequestTrackingMiddleware
 from . import background_tasks, globals
 
 if TYPE_CHECKING:
@@ -84,3 +88,13 @@ def schedule_browser(host: str, port: int) -> Tuple[threading.Thread, threading.
     thread = threading.Thread(target=in_thread, args=(host, port), daemon=True)
     thread.start()
     return thread, cancel
+
+
+def set_storage_secret(storage_secret: Optional[str] = None) -> None:
+    """Set storage_secret for ui.run() and run_with."""
+    if any(m.cls == SessionMiddleware for m in globals.app.user_middleware):
+        # NOTE not using "add_middleware" because it would be the wrong order
+        globals.app.user_middleware.append(Middleware(RequestTrackingMiddleware))
+    elif storage_secret is not None:
+        globals.app.add_middleware(RequestTrackingMiddleware)
+        globals.app.add_middleware(SessionMiddleware, secret_key=storage_secret)

+ 1 - 9
nicegui/run.py

@@ -7,8 +7,6 @@ from typing import Any, List, Optional, Tuple
 
 import __main__
 import uvicorn
-from starlette.middleware import Middleware
-from starlette.middleware.sessions import SessionMiddleware
 from uvicorn.main import STARTUP_FAILURE
 from uvicorn.supervisors import ChangeReload, Multiprocess
 
@@ -16,7 +14,6 @@ from . import globals, helpers
 from . import native as native_module
 from . import native_mode
 from .language import Language
-from .storage import RequestTrackingMiddleware
 
 
 class Server(uvicorn.Server):
@@ -28,12 +25,7 @@ class Server(uvicorn.Server):
         if native_module.method_queue is not None:
             globals.app.native.main_window = native_module.WindowProxy()
 
-        if any(m.cls == SessionMiddleware for m in globals.app.user_middleware):
-            # NOTE not using "add_middleware" because it would be the wrong order
-            globals.app.user_middleware.append(Middleware(RequestTrackingMiddleware))
-        elif self.config.storage_secret is not None:
-            globals.app.add_middleware(RequestTrackingMiddleware)
-            globals.app.add_middleware(SessionMiddleware, secret_key=self.config.storage_secret)
+        helpers.set_storage_secret(self.config.storage_secret)
         super().run(sockets=sockets)
 
 

+ 3 - 0
nicegui/run_with.py

@@ -3,6 +3,7 @@ from typing import Optional
 from fastapi import FastAPI
 
 from nicegui import globals
+from nicegui.helpers import set_storage_secret
 from nicegui.language import Language
 from nicegui.nicegui import handle_shutdown, handle_startup
 
@@ -17,6 +18,7 @@ def run_with(
     binding_refresh_interval: float = 0.1,
     exclude: str = '',
     mount_path: str = '/',
+    storage_secret: Optional[str] = None,
 ) -> None:
     globals.ui_run_has_been_called = True
     globals.title = title
@@ -28,6 +30,7 @@ def run_with(
     globals.excludes = [e.strip() for e in exclude.split(',')]
     globals.tailwind = True
 
+    set_storage_secret(storage_secret)
     app.on_event('startup')(lambda: handle_startup(with_welcome_message=False))
     app.on_event('shutdown')(lambda: handle_shutdown())