Skip to content

Commit a9eb343

Browse files
authored
Merge pull request #2265 from AnnMarieW/remove_before_first_request
removed deprecated before_first_request
2 parents 865c93b + f0ce891 commit a9eb343

File tree

3 files changed

+36
-21
lines changed

3 files changed

+36
-21
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ This project adheres to [Semantic Versioning](https://semver.org/).
1010

1111
### Fixed
1212

13+
- [#2265](https://github.com/plotly/dash/pull/2265) Removed deprecated `before_first_request` as reported in [#2177](https://github.com/plotly/dash/issues/2177).
1314
- [#2257](https://github.com/plotly/dash/pull/2257) Fix tuple types in the TypeScript component generator.
1415

1516
## [2.6.2] - 2022-09-23

dash/_pages.py

+22-1
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
from urllib.parse import parse_qs
66
from fnmatch import fnmatch
77
import re
8+
import flask
89

910
from . import _validate
1011
from ._utils import AttributeDict
1112
from ._get_paths import get_relative_path
1213
from ._callback_context import context_value
14+
from ._get_app import get_app
1315

1416

1517
CONFIG = AttributeDict()
@@ -118,6 +120,25 @@ def _parse_path_variables(pathname, path_template):
118120
return dict(zip(var_names, variables))
119121

120122

123+
def _create_redirect_function(redirect_to):
124+
def redirect():
125+
return flask.redirect(redirect_to, code=301)
126+
127+
return redirect
128+
129+
130+
def _set_redirect(redirect_from, path):
131+
app = get_app()
132+
if redirect_from and len(redirect_from):
133+
for redirect in redirect_from:
134+
fullname = app.get_relative_path(redirect)
135+
app.server.add_url_rule(
136+
fullname,
137+
fullname,
138+
_create_redirect_function(app.get_relative_path(path)),
139+
)
140+
141+
121142
def register_page(
122143
module,
123144
path=None,
@@ -280,7 +301,7 @@ def register_page(
280301
image=(image if image is not None else _infer_image(module)),
281302
image_url=image_url,
282303
)
283-
page.update(redirect_from=redirect_from)
304+
page.update(redirect_from=_set_redirect(redirect_from, page["path"]))
284305

285306
PAGE_REGISTRY[module] = page
286307

dash/dash.py

+13-20
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,9 @@ def __init__( # pylint: disable=too-many-statements
497497
for plugin in plugins:
498498
plugin.plug(self)
499499

500+
# tracks internally if a function already handled at least one request.
501+
self._got_first_request = {"pages": False, "setup_server": False}
502+
500503
if self.server is not None:
501504
self.init_app()
502505

@@ -542,7 +545,7 @@ def _handle_error(_):
542545
"""Handle a halted callback and return an empty 204 response."""
543546
return "", 204
544547

545-
self.server.before_first_request(self._setup_server)
548+
self.server.before_request(self._setup_server)
546549

547550
# add a handler for components suites errors to return 404
548551
self.server.errorhandler(InvalidResourceError)(self._invalid_resources_handler)
@@ -1271,6 +1274,10 @@ def dispatch(self):
12711274
return response
12721275

12731276
def _setup_server(self):
1277+
if self._got_first_request["setup_server"]:
1278+
return
1279+
self._got_first_request["setup_server"] = True
1280+
12741281
# Apply _force_eager_loading overrides from modules
12751282
eager_loading = self.config.eager_loading
12761283
for module_name in ComponentRegistry.registry:
@@ -2027,8 +2034,12 @@ def enable_pages(self):
20272034
if self.pages_folder:
20282035
self._import_layouts_from_pages()
20292036

2030-
@self.server.before_first_request
2037+
@self.server.before_request
20312038
def router():
2039+
if self._got_first_request["pages"]:
2040+
return
2041+
self._got_first_request["pages"] = True
2042+
20322043
@self.callback(
20332044
Output(_ID_CONTENT, "children"),
20342045
Output(_ID_STORE, "data"),
@@ -2107,24 +2118,6 @@ def update(pathname, search):
21072118
Input(_ID_STORE, "data"),
21082119
)
21092120

2110-
def create_redirect_function(redirect_to):
2111-
def redirect():
2112-
return flask.redirect(redirect_to, code=301)
2113-
2114-
return redirect
2115-
2116-
# Set redirects
2117-
for module in _pages.PAGE_REGISTRY:
2118-
page = _pages.PAGE_REGISTRY[module]
2119-
if page["redirect_from"] and len(page["redirect_from"]):
2120-
for redirect in page["redirect_from"]:
2121-
fullname = self.get_relative_path(redirect)
2122-
self.server.add_url_rule(
2123-
fullname,
2124-
fullname,
2125-
create_redirect_function(page["relative_path"]),
2126-
)
2127-
21282121
def run_server(self, *args, **kwargs):
21292122
"""`run_server` is a deprecated alias of `run` and may be removed in a
21302123
future version. We recommend using `app.run` instead.

0 commit comments

Comments
 (0)