Skip to content

Commit 686f32f

Browse files
committed
fixing pages for use with fastapi
1 parent 2cd769e commit 686f32f

File tree

4 files changed

+39
-11
lines changed

4 files changed

+39
-11
lines changed

dash/_pages.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -389,15 +389,15 @@ def _path_to_page(path_id):
389389
return {}, None
390390

391391

392-
def _page_meta_tags(app):
393-
start_page, path_variables = _path_to_page(flask.request.path.strip("/"))
392+
def _page_meta_tags(app, request):
393+
request_url = request.get_path()
394+
start_page, path_variables = _path_to_page(request_url.strip("/"))
394395

395-
# use the supplied image_url or create url based on image in the assets folder
396396
image = start_page.get("image", "")
397397
if image:
398398
image = app.get_asset_url(image)
399399
assets_image_url = (
400-
"".join([flask.request.url_root, image.lstrip("/")]) if image else None
400+
"".join([request.url_root, image.lstrip("/")]) if image else None
401401
)
402402
supplied_image_url = start_page.get("image_url")
403403
image_url = supplied_image_url if supplied_image_url else assets_image_url
@@ -413,7 +413,7 @@ def _page_meta_tags(app):
413413
return [
414414
{"name": "description", "content": description},
415415
{"property": "twitter:card", "content": "summary_large_image"},
416-
{"property": "twitter:url", "content": flask.request.url},
416+
{"property": "twitter:url", "content": request_url},
417417
{"property": "twitter:title", "content": title},
418418
{"property": "twitter:description", "content": description},
419419
{"property": "twitter:image", "content": image_url or ""},

dash/dash.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
ProxyError,
4545
DuplicateCallback,
4646
)
47+
from .server_factories import get_request_adapter
4748
from .version import __version__
4849
from ._configs import get_combined_config, pathname_configs, pages_folder_config
4950
from ._utils import (
@@ -1141,9 +1142,10 @@ def render_index(self, *args, **kwargs):
11411142
metas = self._generate_meta()
11421143
renderer = self._generate_renderer()
11431144
title = self.title
1145+
request = get_request_adapter()
11441146

11451147
if self.use_pages and self.config.include_pages_meta:
1146-
metas = _page_meta_tags(self) + metas
1148+
metas = _page_meta_tags(self, request) + metas
11471149

11481150
if self._favicon:
11491151
favicon_mod_time = os.path.getmtime(
@@ -2331,7 +2333,7 @@ def enable_pages(self) -> None:
23312333
if self.pages_folder:
23322334
_import_layouts_from_pages(self.config.pages_folder)
23332335

2334-
@self.server.before_request
2336+
23352337
def router():
23362338
if self._got_first_request["pages"]:
23372339
return
@@ -2487,5 +2489,6 @@ def update(pathname_, search_, **states):
24872489
Input(_ID_STORE, "data"),
24882490
)
24892491

2492+
self.server_factory.before_request(self.server, router)
24902493
def __call__(self, *args, **kwargs):
24912494
return self.server_factory.__call__(self.server, *args, **kwargs)

dash/server_factories/fastapi_factory.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,27 @@ async def wrapped(*args, **kwargs):
5555
return wrapped
5656

5757
def setup_index(self, app, dash_app):
58-
async def index():
58+
async def index(request: Request):
59+
adapter = FastAPIRequestAdapter()
60+
set_request_adapter(adapter)
61+
adapter.set_request(request)
5962
return Response(content=dash_app.render_index(), media_type="text/html")
6063
self.add_url_rule(app, "/", index, endpoint="index", methods=["GET"])
6164

6265
def setup_catchall(self, app, dash_app):
63-
async def catchall(path: str):
64-
return Response(content=dash_app.render_index(), media_type="text/html")
66+
@dash_app.server.on_event("startup")
67+
def _setup_catchall():
68+
from fastapi import Request, Response
6569

66-
# self.add_url_rule(app, "/{path:path}", catchall, endpoint="catchall", methods=["GET"])
70+
async def catchall(path: str, request: Request):
71+
adapter = FastAPIRequestAdapter()
72+
set_request_adapter(adapter)
73+
adapter.set_request(request)
74+
return Response(content=dash_app.render_index(), media_type="text/html")
75+
76+
self.add_url_rule(app, "/{path:path}", catchall, endpoint="catchall", methods=["GET"])
77+
78+
pass # catchall needs to be last to not override other routes
6779

6880
def add_url_rule(self, app, rule, view_func, endpoint=None, methods=None):
6981
if rule == "":
@@ -228,3 +240,6 @@ def get_remote_addr(self):
228240

229241
def get_origin(self):
230242
return self._request.headers.get("origin")
243+
244+
def get_path(self):
245+
return self._request.url.path # <-- Add this method

dash/server_factories/flask_factory.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,17 @@ def get_request_adapter(self):
5858

5959
def setup_catchall(self, app, dash_app):
6060
def catchall(path, *args, **kwargs):
61+
adapter = FlaskRequestAdapter()
62+
set_request_adapter(adapter)
63+
adapter.set_request(flask.request)
6164
return dash_app.render_index(*args, **kwargs)
6265
self.add_url_rule(app, "/<path:path>", catchall, endpoint="catchall", methods=["GET"])
6366

6467
def setup_index(self, app, dash_app):
6568
def index(*args, **kwargs):
69+
adapter = FlaskRequestAdapter()
70+
set_request_adapter(adapter)
71+
adapter.set_request(flask.request)
6672
return dash_app.render_index(dash_app, *args, **kwargs)
6773

6874
self.add_url_rule(app, "/", index, endpoint="index", methods=["GET"])
@@ -186,3 +192,7 @@ def get_remote_addr():
186192
@staticmethod
187193
def get_origin():
188194
return getattr(flask.request, 'origin', None)
195+
196+
@staticmethod
197+
def get_path():
198+
return flask.request.path

0 commit comments

Comments
 (0)