Skip to content
Merged
Changes from 1 commit
Commits
Show all changes
135 commits
Select commit Hold shift + click to select a range
358a045
Fallback on background callback function names if source cannot be found
corebit-nl Nov 22, 2025
27571ca
Merge branch 'dev' into patch-1
T4rk1n Nov 28, 2025
cfa8838
Merge branch 'dev' into patch-1
corebit-nl Jan 9, 2026
5932df4
fixes issue where components wouldnt remount when passed as a childre…
BSd3v Jan 12, 2026
cb1f299
update to remove hashes of decendents upon `newRender`
BSd3v Jan 20, 2026
8e960df
fix for lint
BSd3v Jan 21, 2026
fd25ea8
fixing issue with bad setState
BSd3v Jan 21, 2026
dc2e3ad
fixing for lint
BSd3v Jan 21, 2026
316b9ac
fix for lint
BSd3v Jan 21, 2026
324d374
Merge branch 'dev' into fix-react-state-parent-render-2
BSd3v Feb 2, 2026
8c23c3a
Merge branch 'dev' into fix-react-state-parent-render-2
BSd3v Feb 6, 2026
e7f4666
adjustment for failing test
BSd3v Feb 6, 2026
7cb53d5
Merge branch 'dev' into patch-1
corebit-nl Feb 7, 2026
b73fcee
Merge branch 'dev' into fix-react-state-parent-render-2
BSd3v Feb 24, 2026
4ddfe81
Allow user to start searching dropdowns by typing (without opening fi…
KoolADE85 Feb 24, 2026
de1ba5a
Merge branch 'dev' into fix-react-state-parent-render-2
T4rk1n Feb 27, 2026
c2bf83b
add debounce to Dropdown
AnnMarieW Mar 2, 2026
2adad3a
fix search_value
AnnMarieW Mar 2, 2026
a47d354
fix tests
AnnMarieW Mar 3, 2026
34b7185
Merge branch 'dev' into add-debounce-to-dropdown
AnnMarieW Mar 3, 2026
060fe3c
add test
AnnMarieW Mar 3, 2026
36d6cd6
add changelog
AnnMarieW Mar 3, 2026
bac54a8
lint
AnnMarieW Mar 3, 2026
737370f
lint
AnnMarieW Mar 3, 2026
0b23cb7
re-run tests
AnnMarieW Mar 3, 2026
633416d
Update CODEOWNERS
emilykl Mar 3, 2026
ddcd3f9
Merge pull request #3640 from plotly/update-codeowners-emilykl
T4rk1n Mar 4, 2026
6de4b8d
fix: flatten outputs before building loadingOutputs
i-murray Mar 4, 2026
7ea7c65
fix multiselect dropdown with components as labels
AnnMarieW Mar 4, 2026
ff8961f
fixed test
AnnMarieW Mar 4, 2026
ba99851
Merge branch 'dev' into add-debounce-to-dropdown
T4rk1n Mar 6, 2026
9ab7970
Merge pull request #3637 from AnnMarieW/add-debounce-to-dropdown
T4rk1n Mar 6, 2026
a442768
Merge branch 'dev' into fix-react-state-parent-render-2
T4rk1n Mar 11, 2026
52162a0
group up weekly dependabot updates
T4rk1n Mar 11, 2026
8366cfc
Merge pull request #3647 from plotly/dependabot-groups
T4rk1n Mar 11, 2026
2cfaafb
Implement virtualized lists for large collections of options
KoolADE85 Feb 26, 2026
f6dd876
Merge branch 'dev' into bugfix/3572
KoolADE85 Mar 11, 2026
ade98d6
code review feedback
KoolADE85 Mar 11, 2026
ebc480e
Fix CI tests
KoolADE85 Mar 11, 2026
a4315b2
empty commit for ci
KoolADE85 Mar 11, 2026
69b3628
fix integration test
KoolADE85 Mar 11, 2026
98f2064
update after review
AnnMarieW Mar 11, 2026
1edb877
update after review
AnnMarieW Mar 11, 2026
c634cf5
lint
AnnMarieW Mar 11, 2026
343c8c4
Merge pull request #3627 from plotly/bugfix/3572
KoolADE85 Mar 12, 2026
6bcc04e
Merge branch 'dev' into bugfix/3616
KoolADE85 Mar 12, 2026
bc2719e
Merge branch 'dev' into fix-multi-select-dropdown-with-components-as-…
AnnMarieW Mar 12, 2026
c5c8a65
add changelog
KoolADE85 Mar 12, 2026
e05d073
empty commit for ci
KoolADE85 Mar 12, 2026
9c5a17e
Run linter on Datepickers
KoolADE85 Mar 12, 2026
bd8d378
Merge pull request #3658 from plotly/chore/lint
KoolADE85 Mar 12, 2026
3c3c1a5
Fix single-date selection in DatePickerRange
KoolADE85 Mar 12, 2026
76511d8
code cleanup
KoolADE85 Mar 12, 2026
d5900a4
Merge branch 'dev' into bugfix/3616
KoolADE85 Mar 12, 2026
b9201db
Merge branch 'dev' into bugfix/3645
KoolADE85 Mar 12, 2026
1c6db3e
update changelog
KoolADE85 Mar 12, 2026
e4cd2f8
empty commit for ci
KoolADE85 Mar 12, 2026
2bc7ea1
empty commit for ci
KoolADE85 Mar 12, 2026
1c10c88
Merge pull request #3660 from plotly/bugfix/3645
KoolADE85 Mar 13, 2026
02acd6e
Merge branch 'dev' into fix-multi-select-dropdown-with-components-as-…
KoolADE85 Mar 13, 2026
922c940
Fix bug with inline checklists and dynamically sized option labels
KoolADE85 Mar 13, 2026
9fcf650
Merge branch 'dev' into bugfix/3616
KoolADE85 Mar 13, 2026
eb69078
Merge pull request #3656 from plotly/bugfix/3616
KoolADE85 Mar 16, 2026
422f311
Merge branch 'dev' into fix-multi-select-dropdown-with-components-as-…
KoolADE85 Mar 16, 2026
5e56a81
Fix dropdown search bar loses focus when using virtualized lists
KoolADE85 Mar 16, 2026
64826e9
Merge branch 'dev' into bugfix/3616
KoolADE85 Mar 16, 2026
d95ddc3
fixing issue where FastAPI would not allow new paths to be added
BSd3v Mar 17, 2026
bebfe63
test: add test for loading spinner with ALL wildcard pattern matching
i-murray Mar 17, 2026
98da561
adjustments for computeGraphs to not have validation when in debug is…
BSd3v Mar 19, 2026
f6c604c
adjustments for load different between dash 3 and dash 4
BSd3v Mar 19, 2026
680ad95
adjustments to use pattern maps and then offload to the expected patt…
BSd3v Mar 19, 2026
d514570
adjustments based on feedback
BSd3v Mar 19, 2026
cd5534c
adjustments for the component_api
BSd3v Mar 19, 2026
ffff73d
fix for lint
BSd3v Mar 19, 2026
91e05f4
Merge pull request #3665 from plotly/bugfix/3616
camdecoster Mar 20, 2026
6076bb8
Merge branch 'dev' into fix-multi-select-dropdown-with-components-as-…
T4rk1n Mar 20, 2026
2eae131
Merge pull request #3643 from AnnMarieW/fix-multi-select-dropdown-wit…
T4rk1n Mar 23, 2026
c487a0a
Add Adrian to CODEOWNERS
T4rk1n Mar 23, 2026
48f9bbb
release 4.1.0
KoolADE85 Mar 23, 2026
6cd55e8
bump browserlist
T4rk1n Mar 23, 2026
550a4d6
Merge pull request #3683 from plotly/codeowner-update
T4rk1n Mar 23, 2026
aede54b
Merge branch 'dev' into release/4.1.0
KoolADE85 Mar 23, 2026
ac5ca89
Merge branch 'dev' into fix/3661-compute-graphs2
T4rk1n Mar 23, 2026
575c7f1
bump versions
KoolADE85 Mar 23, 2026
136e66c
add missing changelog entry
KoolADE85 Mar 23, 2026
67992ea
Merge pull request #3672 from BSd3v/fix/3661-compute-graphs2
T4rk1n Mar 23, 2026
4e70240
Merge branch 'dev' into release/4.1.0
KoolADE85 Mar 23, 2026
e33d2e4
Merge pull request #3685 from plotly/release/4.1.0
KoolADE85 Mar 23, 2026
50b3003
add missing changelog entry
KoolADE85 Mar 23, 2026
e22ba3f
Merge branch 'dev' into release/4.1.0
KoolADE85 Mar 23, 2026
ada7f35
style: apply black formatting and fix duplicate test name
i-murray Mar 24, 2026
9b9057a
add missing changelog entry
KoolADE85 Mar 23, 2026
b845bbf
Merge pull request #3688 from plotly/release/4.1.0
KoolADE85 Mar 24, 2026
0c21435
Merge branch 'dev' into fix-react-state-parent-render-2
T4rk1n Mar 24, 2026
d2e5bbe
Merge pull request #3570 from BSd3v/fix-react-state-parent-render-2
T4rk1n Mar 24, 2026
cc10343
Fix input when min or max is None
AnnMarieW Mar 24, 2026
6b6d1cc
Merge branch 'dev' into fix-3689-input-min-max
AnnMarieW Mar 25, 2026
bc52e55
changelog
AnnMarieW Mar 25, 2026
9776a78
Merge branch 'dev' into bugfix/loading-all-wildcard-3619
i-murray Mar 25, 2026
cd8648b
Merge pull request #3690 from AnnMarieW/fix-3689-input-min-max
T4rk1n Mar 25, 2026
d97f9bc
Merge branch 'dev' into patch-1
camdecoster Mar 25, 2026
80b1213
Merge branch 'dev' into bugfix/loading-all-wildcard-3619
T4rk1n Mar 26, 2026
ea1af01
Add changelog entry (and fix some markdown)
camdecoster Mar 26, 2026
c1a9cd9
Merge pull request #3523 from corebit-nl/patch-1
camdecoster Mar 26, 2026
8da44c1
fix: use attribute selector for dict id in loading test
i-murray Mar 28, 2026
3fcd2c9
Merge branch 'dev' into bugfix/loading-all-wildcard-3619
i-murray Mar 28, 2026
b18fdfd
put 14 days minimum release age for dependabot
T4rk1n Apr 1, 2026
ee1fb3f
group up dependabot security updates
T4rk1n Apr 1, 2026
7fa111f
only allow safe to update dcc dependabot
T4rk1n Apr 1, 2026
2ee42bb
narrow other dependencies
T4rk1n Apr 1, 2026
7c8c47d
exclude plotly directory
T4rk1n Apr 1, 2026
26c6752
minimum-release-age -> cooldown
T4rk1n Apr 1, 2026
cb12671
fix dcc build
T4rk1n Apr 2, 2026
b97a99f
bump browserlist dash-table
T4rk1n Apr 2, 2026
e97d6d6
npm audit fix
T4rk1n Apr 2, 2026
608aa7b
fix linting
T4rk1n Apr 2, 2026
f0fabb9
fix black
T4rk1n Apr 2, 2026
b494ad3
wait for table after sort
T4rk1n Apr 2, 2026
38ae498
Merge pull request #3709 from plotly/fix/dependabot-too-much
T4rk1n Apr 2, 2026
78f760e
Bump the npm-dependencies-security group across 1 directory with 5 up…
dependabot[bot] Apr 2, 2026
fa21fcb
Merge pull request #3718 from plotly/dependabot/npm_and_yarn/npm-depe…
T4rk1n Apr 2, 2026
fc7fe59
Bump the npm-dependencies-security group across 1 directory with 1 up…
dependabot[bot] Apr 2, 2026
54cd282
Fix #2989: Preserve option order during dcc.Dropdown search
ines-om Mar 22, 2026
57f4125
Fix #2989, #2667: Add search_order prop to control dropdown result or…
ines-om Apr 3, 2026
3a7744f
Merge pull request #3724 from plotly/dependabot/npm_and_yarn/npm-depe…
T4rk1n Apr 6, 2026
b6fcc4a
Add changelog entry
ines-om Apr 6, 2026
f29d9c5
Merge branch 'dev' into fix-dccDropdown-order
T4rk1n Apr 7, 2026
3d6602f
Merge pull request #3680 from ines-om/fix-dccDropdown-order
T4rk1n Apr 7, 2026
98ba64e
fix lint
T4rk1n Apr 7, 2026
6931953
Merge branch 'dev' into v4.1-fix-FastAPI-paths
T4rk1n Apr 7, 2026
229539e
set test typing to not run on master
T4rk1n Apr 8, 2026
3c4af8e
Merge pull request #3730 from plotly/disable-typing-test-master
T4rk1n Apr 8, 2026
830271c
Merge branch 'dev' into bugfix/loading-all-wildcard-3619
camdecoster Apr 8, 2026
4fe351e
Merge pull request #3641 from i-murray/bugfix/loading-all-wildcard-3619
T4rk1n Apr 8, 2026
cd0d46a
Merge branch 'dev' into v4.1-fix-FastAPI-paths
T4rk1n Apr 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 42 additions & 9 deletions dash/backends/_fastapi.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,11 @@
) from _err

from dash.fingerprint import check_fingerprint
from dash import _validate
from dash import _validate, get_app
from dash.exceptions import PreventUpdate
from .base_server import BaseDashServer, RequestAdapter, ResponseAdapter
from ._utils import format_traceback_html
import traceback

if TYPE_CHECKING: # pragma: no cover - typing only
from dash import Dash
Expand Down Expand Up @@ -122,8 +123,12 @@ async def _initialize_dev_tools(self) -> None:
self.dash_app.enable_dev_tools(**config, first_run=False)
self._dev_tools_initialized = True

def _setup_timing(self, request: Request) -> None:
async def _setup_timing(self, request: Request) -> None:
"""Set up timing information for the request."""
try:
request.state.json_body = await request.json() if request.headers.get("content-type", "").startswith("application/json") else None
except:
request.state.json_body = None
if self.enable_timing:
request.state.timing_information = {
"__dash_server": {"dur": time.time(), "desc": None}
Expand Down Expand Up @@ -179,6 +184,12 @@ async def _handle_error(
async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
# Handle lifespan events (startup/shutdown)
if scope["type"] == "lifespan":
try:
dash_app = get_app()
dash_app.backend._setup_catchall()
except:
print("Error during catch-all setup:")
print(traceback.format_exc())
await self._initialize_dev_tools()
await self.app(scope, receive, send)
return
Expand All @@ -193,7 +204,7 @@ async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
token = set_current_request(request)

try:
self._setup_timing(request)
await self._setup_timing(request)
await self._run_before_hooks()

await self.app(scope, receive, send)
Expand Down Expand Up @@ -275,11 +286,24 @@ async def index(_request: Request):
dash_app._add_url("", index, methods=["GET"])

def setup_catchall(self, dash_app: Dash):
async def catchall(_request: Request):
return Response(content=dash_app.index(), media_type="text/html")
'''This is needed to ensure that all routes are handled by FastAPI
and passed through the middleware, which is necessary for features like authentication
and timing to work correctly on all routes. FastAPI will match this catch-all route
for any path that isn't matched by a more specific route, allowing the middleware to
process the request and then return the appropriate response (e.g., 404 if no Dash route matches).'''

# pylint: disable=protected-access
dash_app._add_url("{path:path}", catchall, methods=["GET"])

def _setup_catchall(self):
try:
print("Setting up catch-all route for unmatched paths")
dash_app = get_app()
async def catchall(_request: Request):
return Response(content=dash_app.index(), media_type="text/html")

# pylint: disable=protected-access
self.add_url_rule("{path:path}", catchall, methods=["GET"])
except:
print(traceback.format_exc())

def add_url_rule(
self,
Expand All @@ -289,6 +313,7 @@ def add_url_rule(
methods: list[str] | None = None,
include_in_schema: bool = False,
):
print(f"Adding URL rule: {rule} -> {view_func} (endpoint: {endpoint}, methods: {methods})")
if rule == "":
rule = "/"
if isinstance(view_func, str):
Expand Down Expand Up @@ -481,7 +506,7 @@ def add_redirect_rule(self, app, fullname, path):
def serve_callback(self, dash_app: Dash):
async def _dispatch(request: Request):
# pylint: disable=protected-access
body = await request.json()
body = self.request_adapter().get_json()
cb_ctx = dash_app._initialize_context(
body
) # pylint: disable=protected-access
Expand Down Expand Up @@ -641,5 +666,13 @@ def origin(self):
def path(self):
return self._request.url.path

async def _get_json(self, request: Request=None):
req = self._request
if not hasattr(req.state, "json_body"):
req.state.json_body = await request.json()
return req.state.json_body

def get_json(self):
return asyncio.run(self._request.json())
if not hasattr(self, "_request") or self._request is None:
self._request = get_current_request()
return self._request.state.json_body
Loading