(self)
| 801 | ) |
| 802 | |
| 803 | def _setup_routes(self): |
| 804 | self.backend.setup_component_suites(self) |
| 805 | self._add_url("_dash-layout", self.serve_layout) |
| 806 | self._add_url("_dash-dependencies", self.dependencies) |
| 807 | self._add_url( |
| 808 | "_dash-update-component", |
| 809 | self.backend.serve_callback(self), |
| 810 | ["POST"], |
| 811 | ) |
| 812 | self._add_url("_reload-hash", self.serve_reload_hash) |
| 813 | self._add_url( |
| 814 | "_favicon.ico", |
| 815 | self._serve_default_favicon, # pylint: disable=protected-access |
| 816 | ) |
| 817 | if self.config.health_endpoint is not None: |
| 818 | self._add_url(self.config.health_endpoint, self.serve_health) |
| 819 | |
| 820 | # Set up WebSocket callback route if backend supports it |
| 821 | # This enables both global websocket_callbacks and per-callback websocket=True |
| 822 | if self.backend.websocket_capability: |
| 823 | self.backend.serve_websocket_callback(self) |
| 824 | |
| 825 | self.backend.setup_index(self) |
| 826 | self.backend.setup_catchall(self) |
| 827 | |
| 828 | if jupyter_dash.active: |
| 829 | self._add_url( |
| 830 | "_alive_" + jupyter_dash.alive_token, jupyter_dash.serve_alive |
| 831 | ) |
| 832 | |
| 833 | for hook in self._hooks.get_hooks("routes"): |
| 834 | self._add_url( |
| 835 | hook.data["name"], |
| 836 | with_app_context_factory(hook.func, self), |
| 837 | hook.data["methods"], |
| 838 | ) |
| 839 | |
| 840 | if self._enable_mcp: |
| 841 | from .mcp import ( # pylint: disable=import-outside-toplevel |
| 842 | enable_mcp_server, |
| 843 | ) |
| 844 | |
| 845 | try: |
| 846 | enable_mcp_server(self, self._mcp_path) |
| 847 | except Exception as e: # pylint: disable=broad-exception-caught |
| 848 | self._enable_mcp = False |
| 849 | self.logger.warning( |
| 850 | "MCP server could not be started at '%s': %s", |
| 851 | self._mcp_path, |
| 852 | e, |
| 853 | ) |
| 854 | |
| 855 | def setup_apis(self): |
| 856 | """ |
no test coverage detected