sanic-org / sanic

Accelerate your web app development | Build fast. Run fast.
https://sanic.dev
MIT License
18k stars 1.54k forks source link

[Feature Request] Warn when multiple route names are the same #2524

Closed BenJeau closed 2 years ago

BenJeau commented 2 years ago

Is your feature request related to a problem? Please describe your use case. Just spent a good amount of time trying to figure why injections were not working on certain routes, after digging the code a bit more, it seemed like when the route names are the same, the injection will overwrite the value in the SignatureRegistry

Describe the solution you'd like Something like this, showing which route names are already in the registry and maybe also mentioning which route have injections (although that last one would be for debugging purposes, maybe have a toggle?):

[2022-08-08 21:17:46 -0400] [80724] [DEBUG] Dispatching signal: server.init.after
[2022-08-08 21:23:19 -0400] [81202] [DEBUG] Injecting into route 'manager.cases.get_cases' {'user': (<class 'src.utils.User'>, <Constructor(func=create)>)} 
[2022-08-08 21:23:19 -0400] [81202] [WARNING] Following route has already been injected: 'ioc_manager.templates.get_rule_filters'
[2022-08-08 21:23:19 -0400] [81202] [WARNING] Following route has already been injected: 'ioc_manager.cases.get_case_iocs'
[2022-08-08 21:23:19 -0400] [81202] [WARNING] Following route has already been injected: 'ioc_manager.cases.get_case_iocs'
[2022-08-08 21:17:46 -0400] [80724] [INFO] Starting worker [80724]

For the warning, I've just added a simple check here:

https://github.com/sanic-org/sanic-ext/blob/b65cd9f28c8d1e6ee0aad91685bfb84fc4925ac6/sanic_ext/extensions/injection/registry.py#L54-L59

With

    def register(
        self,
        route_name: str,
        injections: Dict[str, Tuple[Type, Optional[Callable[..., Any]]]],
    ) -> None:
        if route_name in self._registry:
            logger.warning(f"Following route has already been injected: '{route_name}'")
        self._registry[route_name] = injections
BenJeau commented 2 years ago

Not sure if this should be a part of sanic_ext or sanic

BenJeau commented 2 years ago

Another way would be to list, at the beginning when starting the server, all the routes and their route names, and then warning on the duplicate ones (I would personally love this since you sometimes don't know which routes/handlers actually get registered when you have a big codebase with nested blueprints) - unless that's already a feature

ahopkins commented 2 years ago

This is a known thing. We will probably start with a warning and eventually raise an error for duplicate named routes. It will probably be a part of sanic-routing in finalize.

ahopkins commented 2 years ago

I am going to solve this in app startup so we can provide a deprecation notice consistently.