|
@@ -14,13 +14,20 @@ doc.title('Storage')
|
|
|
|
|
|
@doc.demo('Storage', '''
|
|
@doc.demo('Storage', '''
|
|
NiceGUI offers a straightforward mechanism for data persistence within your application.
|
|
NiceGUI offers a straightforward mechanism for data persistence within your application.
|
|
- It features four built-in storage types:
|
|
|
|
|
|
+ It features five built-in storage types:
|
|
|
|
|
|
- `app.storage.tab`:
|
|
- `app.storage.tab`:
|
|
Stored server-side in memory, this dictionary is unique to each tab session and can hold arbitrary objects.
|
|
Stored server-side in memory, this dictionary is unique to each tab session and can hold arbitrary objects.
|
|
Data will be lost when restarting the server until <https://github.com/zauberzeug/nicegui/discussions/2841> is implemented.
|
|
Data will be lost when restarting the server until <https://github.com/zauberzeug/nicegui/discussions/2841> is implemented.
|
|
This storage is only available within [page builder functions](/documentation/page)
|
|
This storage is only available within [page builder functions](/documentation/page)
|
|
and requires an established connection, obtainable via [`await client.connected()`](/documentation/page#wait_for_client_connection).
|
|
and requires an established connection, obtainable via [`await client.connected()`](/documentation/page#wait_for_client_connection).
|
|
|
|
+ - `app.storage.client`:
|
|
|
|
+ Also stored server-side in memory, this dictionary is unique to each client connection and can hold arbitrary objects.
|
|
|
|
+ Data will be discarded when the page is reloaded or the user navigates to another page.
|
|
|
|
+ Unlike data stored in `app.storage.tab` which can be persisted on the server even for days,
|
|
|
|
+ `app.storage.client` helps caching resource-hungry objects such as a streaming or database connection you need to keep alive
|
|
|
|
+ for dynamic site updates but would like to discard as soon as the user leaves the page or closes the browser.
|
|
|
|
+ This storage is only available within [page builder functions](/documentation/page).
|
|
- `app.storage.user`:
|
|
- `app.storage.user`:
|
|
Stored server-side, each dictionary is associated with a unique identifier held in a browser session cookie.
|
|
Stored server-side, each dictionary is associated with a unique identifier held in a browser session cookie.
|
|
Unique to each user, this storage is accessible across all their browser tabs.
|
|
Unique to each user, this storage is accessible across all their browser tabs.
|
|
@@ -35,6 +42,16 @@ doc.title('Storage')
|
|
The user storage and browser storage are only available within `page builder functions </documentation/page>`_
|
|
The user storage and browser storage are only available within `page builder functions </documentation/page>`_
|
|
because they are accessing the underlying `Request` object from FastAPI.
|
|
because they are accessing the underlying `Request` object from FastAPI.
|
|
Additionally these two types require the `storage_secret` parameter in`ui.run()` to encrypt the browser session cookie.
|
|
Additionally these two types require the `storage_secret` parameter in`ui.run()` to encrypt the browser session cookie.
|
|
|
|
+
|
|
|
|
+ | Storage type | `tab` | `client` | `user` | `general` | `browser` |
|
|
|
|
+ |-----------------------------|--------|----------|--------|-----------|-----------|
|
|
|
|
+ | Location | Server | Server | Server | Server | Browser |
|
|
|
|
+ | Across tabs | No | No | Yes | Yes | Yes |
|
|
|
|
+ | Across browsers | No | No | No | Yes | No |
|
|
|
|
+ | Across page reloads | Yes | No | Yes | Yes | Yes |
|
|
|
|
+ | Needs page builder function | Yes | Yes | Yes | No | Yes |
|
|
|
|
+ | Needs client connection | Yes | No | No | No | No |
|
|
|
|
+ | Write only before response | No | No | No | No | Yes |
|
|
''')
|
|
''')
|
|
def storage_demo():
|
|
def storage_demo():
|
|
from nicegui import app
|
|
from nicegui import app
|
|
@@ -99,11 +116,37 @@ def ui_state():
|
|
It is also more secure to use such a volatile storage for scenarios like logging into a bank account or accessing a password manager.
|
|
It is also more secure to use such a volatile storage for scenarios like logging into a bank account or accessing a password manager.
|
|
''')
|
|
''')
|
|
def tab_storage():
|
|
def tab_storage():
|
|
- from nicegui import app
|
|
|
|
|
|
+ from nicegui import app, Client
|
|
|
|
|
|
# @ui.page('/')
|
|
# @ui.page('/')
|
|
- # async def index(client):
|
|
|
|
|
|
+ # async def index(client: Client):
|
|
# await client.connected()
|
|
# await client.connected()
|
|
with ui.column(): # HIDE
|
|
with ui.column(): # HIDE
|
|
app.storage.tab['count'] = app.storage.tab.get('count', 0) + 1
|
|
app.storage.tab['count'] = app.storage.tab.get('count', 0) + 1
|
|
ui.label(f'Tab reloaded {app.storage.tab["count"]} times')
|
|
ui.label(f'Tab reloaded {app.storage.tab["count"]} times')
|
|
|
|
+ ui.button('Reload page', on_click=ui.navigate.reload)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+@doc.demo('Short-term memory', '''
|
|
|
|
+ The goal of `app.storage.client` is to store data only for the duration of the current page visit.
|
|
|
|
+ In difference to data stored in `app.storage.tab`
|
|
|
|
+ - which is persisted between page changes and even browser restarts as long as the tab is kept open -
|
|
|
|
+ the data in `app.storage.client` will be discarded if the user closes the browser, reloads the page or navigates to another page.
|
|
|
|
+ This is beneficial for resource-hungry, intentionally short-lived or sensitive data.
|
|
|
|
+ An example is a database connection, which should be closed as soon as the user leaves the page.
|
|
|
|
+ Additionally, this storage useful if you want to return a page with default settings every time a user reloads.
|
|
|
|
+ Meanwhile, it keeps the data alive during in-page navigation.
|
|
|
|
+ This is also helpful when updating elements on the site at intervals, such as a live feed.
|
|
|
|
+''')
|
|
|
|
+def short_term_memory():
|
|
|
|
+ from nicegui import app
|
|
|
|
+
|
|
|
|
+ # @ui.page('/')
|
|
|
|
+ # async def index():
|
|
|
|
+ with ui.column(): # HIDE
|
|
|
|
+ cache = app.storage.client
|
|
|
|
+ cache['count'] = 0
|
|
|
|
+ ui.label().bind_text_from(cache, 'count', lambda n: f'Updated {n} times')
|
|
|
|
+ ui.button('Update content',
|
|
|
|
+ on_click=lambda: cache.update(count=cache['count'] + 1))
|
|
|
|
+ ui.button('Reload page', on_click=ui.navigate.reload)
|