Name endpoints at startup (#1972)

* Name endpoints at startup

* Beautify

* Fix reformatting
This commit is contained in:
Adam Hopkins 2020-11-29 23:26:12 +02:00 committed by GitHub
parent bde0428d0c
commit 614be40438
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 30 additions and 19 deletions

View File

@ -68,7 +68,7 @@ class Sanic:
self.name = name
self.asgi = False
self.router = router or Router()
self.router = router or Router(self)
self.request_class = request_class
self.error_handler = error_handler or ErrorHandler()
self.config = Config(load_env=load_env)
@ -900,7 +900,9 @@ class Sanic:
name = None
try:
# Fetch handler from router
handler, args, kwargs, uri, name = self.router.get(request)
handler, args, kwargs, uri, name, endpoint = self.router.get(
request
)
# -------------------------------------------- #
# Request Middleware
@ -922,16 +924,8 @@ class Sanic:
"handler from the router"
)
)
else:
if not getattr(handler, "__blueprintname__", False):
request.endpoint = self._build_endpoint_name(
handler.__name__
)
else:
request.endpoint = self._build_endpoint_name(
getattr(handler, "__blueprintname__", ""),
handler.__name__,
)
request.endpoint = endpoint
# Run response handler
response = handler(request, *args, **kwargs)

View File

@ -11,7 +11,16 @@ from sanic.views import CompositionView
Route = namedtuple(
"Route", ["handler", "methods", "pattern", "parameters", "name", "uri"]
"Route",
[
"handler",
"methods",
"pattern",
"parameters",
"name",
"uri",
"endpoint",
],
)
Parameter = namedtuple("Parameter", ["name", "cast"])
@ -79,7 +88,8 @@ class Router:
routes_always_check = None
parameter_pattern = re.compile(r"<(.+?)>")
def __init__(self):
def __init__(self, app):
self.app = app
self.routes_all = {}
self.routes_names = {}
self.routes_static_files = {}
@ -299,11 +309,15 @@ class Router:
handler_name = f"{bp_name}.{name or handler.__name__}"
else:
handler_name = name or getattr(handler, "__name__", None)
handler_name = name or getattr(
handler, "__name__", handler.__class__.__name__
)
if route:
route = merge_route(route, methods, handler)
else:
endpoint = self.app._build_endpoint_name(handler_name)
route = Route(
handler=handler,
methods=methods,
@ -311,6 +325,7 @@ class Router:
parameters=parameters,
name=handler_name,
uri=uri,
endpoint=endpoint,
)
self.routes_all[uri] = route
@ -449,7 +464,8 @@ class Router:
route_handler = route.handler
if hasattr(route_handler, "handlers"):
route_handler = route_handler.handlers[method]
return route_handler, [], kwargs, route.uri, route.name
return route_handler, [], kwargs, route.uri, route.name, route.endpoint
def is_stream_handler(self, request):
"""Handler for request is stream or not.

View File

@ -90,6 +90,7 @@ class CompositionView:
def __init__(self):
self.handlers = {}
self.name = self.__class__.__name__
def add(self, methods, handler, stream=False):
if stream:

View File

@ -95,10 +95,10 @@ class RouteStringGenerator:
@pytest.fixture(scope="function")
def sanic_router():
def sanic_router(app):
# noinspection PyProtectedMember
def _setup(route_details: tuple) -> (Router, tuple):
router = Router()
router = Router(app)
added_router = []
for method, route in route_details:
try:

View File

@ -117,7 +117,7 @@ def test_app_route_raise_value_error(app):
def test_app_handle_request_handler_is_none(app, monkeypatch):
def mockreturn(*args, **kwargs):
return None, [], {}, "", ""
return None, [], {}, "", "", None
# Not sure how to make app.router.get() return None, so use mock here.
monkeypatch.setattr(app.router, "get", mockreturn)