diff --git a/sanic/app.py b/sanic/app.py index 9b0bc35e87..3d53e73c98 100644 --- a/sanic/app.py +++ b/sanic/app.py @@ -12,6 +12,7 @@ from traceback import format_exc from typing import Any, Dict, Optional, Type, Union from urllib.parse import urlencode, urlunparse +from warnings import warn from sanic import reloader_helpers from sanic.asgi import ASGIApp @@ -745,6 +746,23 @@ def url_for(self, view_name: str, **kwargs): kw.update(name=view_name) uri, route = self.router.find_route_by_view_name(view_name, **kw) + + # TODO(laggardkernel): this fix should be removed in v21.3. + # Try again without the unnecessary prefix "websocket_handler_", + # which was added by accident on non-blueprint handlers. GH-2021 + if not (uri and route) and view_name.startswith("websocket_handler_"): + view_name = view_name[18:] + uri, route = self.router.find_route_by_view_name(view_name, **kw) + if uri and route: + warn( + "The bug of adding unnecessary `websocket_handler_` prefix " + "in `view_name` param for non-blueprint handlers is fixed. " + "This backward support will be removed in v21.3. Please " + "update `Sanic.url_for()` callings in your code soon.", + DeprecationWarning, + stacklevel=2, + ) + if not (uri and route): raise URLBuildError( f"Endpoint with name `{view_name}` was not found"