| 377 | blueprint.register(app, bp_options) |
| 378 | |
| 379 | def _merge_blueprint_funcs(self, app: App, name: str) -> None: |
| 380 | def extend( |
| 381 | bp_dict: dict[ft.AppOrBlueprintKey, list[t.Any]], |
| 382 | parent_dict: dict[ft.AppOrBlueprintKey, list[t.Any]], |
| 383 | ) -> None: |
| 384 | for key, values in bp_dict.items(): |
| 385 | key = name if key is None else f"{name}.{key}" |
| 386 | parent_dict[key].extend(values) |
| 387 | |
| 388 | for key, value in self.error_handler_spec.items(): |
| 389 | key = name if key is None else f"{name}.{key}" |
| 390 | value = defaultdict( |
| 391 | dict, |
| 392 | { |
| 393 | code: {exc_class: func for exc_class, func in code_values.items()} |
| 394 | for code, code_values in value.items() |
| 395 | }, |
| 396 | ) |
| 397 | app.error_handler_spec[key] = value |
| 398 | |
| 399 | for endpoint, func in self.view_functions.items(): |
| 400 | app.view_functions[endpoint] = func |
| 401 | |
| 402 | extend(self.before_request_funcs, app.before_request_funcs) |
| 403 | extend(self.after_request_funcs, app.after_request_funcs) |
| 404 | extend( |
| 405 | self.teardown_request_funcs, |
| 406 | app.teardown_request_funcs, |
| 407 | ) |
| 408 | extend(self.url_default_functions, app.url_default_functions) |
| 409 | extend(self.url_value_preprocessors, app.url_value_preprocessors) |
| 410 | extend(self.template_context_processors, app.template_context_processors) |
| 411 | |
| 412 | @setupmethod |
| 413 | def add_url_rule( |