Преглед на файлове

Warn about communication attempts with disconnected clients (#3123)

* refactoring

* check existence before communicating with client

* Revert "refactoring"

This reverts commit bf089c28d5acc62be554f67075752ba8d216c0f9.

* add stack trace
Falko Schindler преди 1 година
родител
ревизия
bdc3a1436f
променени са 2 файла, в които са добавени 14 реда и са изтрити 0 реда
  1. 11 0
      nicegui/client.py
  2. 3 0
      nicegui/outbox.py

+ 11 - 0
nicegui/client.py

@@ -59,6 +59,8 @@ class Client:
         self.shared = shared
         self.on_air = False
         self._disconnect_task: Optional[asyncio.Task] = None
+        self._deleted = False
+        self._has_warned_about_deleted_client = False
         self.tab_id: Optional[str] = None
 
         self.outbox = Outbox(self)
@@ -320,6 +322,15 @@ class Client:
         self.remove_all_elements()
         self.outbox.stop()
         del Client.instances[self.id]
+        self._deleted = True
+
+    def check_existence(self) -> None:
+        """Check if the client still exists and print a warning if it doesn't."""
+        if self._deleted and not self._has_warned_about_deleted_client:
+            log.warning('Client has been deleted but is still being used. This is most likely a bug in your application code. '
+                        'See https://github.com/zauberzeug/nicegui/issues/3028 for more information.',
+                        stack_info=True)
+            self._has_warned_about_deleted_client = True
 
     @contextmanager
     def individual_target(self, socket_id: str) -> Iterator[None]:

+ 3 - 0
nicegui/outbox.py

@@ -36,16 +36,19 @@ class Outbox:
 
     def enqueue_update(self, element: Element) -> None:
         """Enqueue an update for the given element."""
+        self.client.check_existence()
         self.updates[element.id] = element
         self._set_enqueue_event()
 
     def enqueue_delete(self, element: Element) -> None:
         """Enqueue a deletion for the given element."""
+        self.client.check_existence()
         self.updates[element.id] = None
         self._set_enqueue_event()
 
     def enqueue_message(self, message_type: MessageType, data: Any, target_id: ClientId) -> None:
         """Enqueue a message for the given client."""
+        self.client.check_existence()
         self.messages.append((target_id, message_type, data))
         self._set_enqueue_event()