@@ -657,7 +657,7 @@ def _create_route_handler_method_map(
657657
658658 return route_map
659659
660- def _build_routes (self , route_handlers : Iterable [BaseRouteHandler ]) -> list [HTTPRoute | ASGIRoute | WebSocketRoute ]:
660+ def _build_routes (self , route_handlers : Iterable [BaseRouteHandler ]) -> list [HTTPRoute | ASGIRoute | WebSocketRoute ]: # noqa: C901
661661 """Create routes for all the handlers"""
662662 routes : list [HTTPRoute | ASGIRoute | WebSocketRoute ] = []
663663
@@ -683,11 +683,19 @@ def _build_routes(self, route_handlers: Iterable[BaseRouteHandler]) -> list[HTTP
683683 HTTPRoute (path = path , route_handlers = _maybe_add_options_handler (path , http_handlers , root = self ))
684684 )
685685
686+ registered_route_handlers = set ()
687+
686688 for finalized_route in routes :
687689 route_handlers = get_route_handlers (finalized_route )
688690
689691 for route_handler in route_handlers :
690- route_handler .on_registration (route = finalized_route , app = self )
692+ # handlers can be registered multiple times, if they define multiple
693+ # paths. in these cases, we don't want to call 'on_registration' more
694+ # than once, so we keep track of the handlers we've already called this
695+ # hook
696+ if route_handler not in registered_route_handlers :
697+ route_handler .on_registration (route = finalized_route , app = self )
698+ registered_route_handlers .add (route_handler )
691699
692700 for plugin in self .plugins .receive_route :
693701 plugin .receive_route (finalized_route )
0 commit comments