[Feature Request] support multiple URL path levels in path template
I'd like to suggest the following behavior for interpreting path templates as part of the pages feature.
The following example can illustrate the requested behavior:
dash.register_page("reports", path_template="/reports/<product>/<feature>/<report_type>/<data_version>")
def layout(product: str | None = None, feature: str | None = None, report_type: str | None = None, data_version: str | None = None) -> Any:
return html.Div(f"{product} {feature} {report_type} {data_version}")
For '/reports' layout will be called with None for all input arguments. For '/reports/spaceship' layout will be called with 'spaceship' for product and None for the rest. Etc.
A template may also combine arguments and static parts. For instance the following two templates may both be supported:
"/reports/<product>/<feature>/types/<report_type>/<data_version>"
"/reports/<product>/<feature>/sub_features/<sub_feature>/<report_type>/<data_version>"
When registering the pages, conflicts should be checked and error raised upon conflict. The rule is that one template should not be a superset of the other. For example, the following templates conflict:
"/reports/<product>/<feature>/types/<report_type>/<data_version>"
"/reports/<product>/<feature>/types/<report_type>"
Here's my suggested python code for checking a conflict between two templates:
def is_variable(var: str) -> bool:
return var[0] == '<' and var[-1] == '>'
def is_template_confict(tpl1: str, tpl2: str) -> bool: # return True if there is a conflict
vars1 = tpl1.split('/')
vars2 = tpl2.split('/')
for ind in range(min(len(vars1), len(vars2))):
if is_variable(vars1[ind]) != is_variable(vars2[ind]):
return False
if not is_variable(vars1[ind]) and vars1[ind] != vars2[ind]:
return False # both are static and not equal
return True