Router tweaks (#2031)

* Add trailing slash when defined and strict_slashes

* Add partial matching, and fix some issues with url_for

* Cover additional edge cases

* cleanup tests
This commit is contained in:
Adam Hopkins
2021-03-01 15:30:52 +02:00
committed by GitHub
parent 4b968dc611
commit 27f64ddae2
14 changed files with 175 additions and 63 deletions

View File

@@ -393,17 +393,22 @@ class Sanic(BaseSanic):
if getattr(route.ctx, "static", None):
filename = kwargs.pop("filename", "")
# it's static folder
if "file_uri" in uri:
folder_ = uri.split("<file_uri:", 1)[0]
if "__file_uri__" in uri:
folder_ = uri.split("<__file_uri__:", 1)[0]
if folder_.endswith("/"):
folder_ = folder_[:-1]
if filename.startswith("/"):
filename = filename[1:]
kwargs["file_uri"] = filename
kwargs["__file_uri__"] = filename
if uri != "/" and uri.endswith("/"):
if (
uri != "/"
and uri.endswith("/")
and not route.strict
and not route.raw_path[:-1]
):
uri = uri[:-1]
if not uri.startswith("/"):
@@ -573,25 +578,27 @@ class Sanic(BaseSanic):
# Define `response` var here to remove warnings about
# allocation before assignment below.
response = None
name = None
try:
# Fetch handler from router
(
route,
handler,
kwargs,
uri,
name,
ignore_body,
) = self.router.get(request)
request.name = name
request._match_info = kwargs
request.route = route
request.name = route.name
request.uri_template = f"/{route.path}"
request.endpoint = request.name
if (
request.stream
and request.stream.request_body
and not ignore_body
and not route.ctx.ignore_body
):
if self.router.is_stream_handler(request):
if hasattr(handler, "is_stream"):
# Streaming handler: lift the size limit
request.stream.request_max_size = float("inf")
else:
@@ -602,15 +609,15 @@ class Sanic(BaseSanic):
# Request Middleware
# -------------------------------------------- #
response = await self._run_request_middleware(
request, request_name=name
request, request_name=route.name
)
# No middleware results
if not response:
# -------------------------------------------- #
# Execute Handler
# -------------------------------------------- #
request.uri_template = f"/{uri}"
if handler is None:
raise ServerError(
(
@@ -619,12 +626,11 @@ class Sanic(BaseSanic):
)
)
request.endpoint = request.name
# Run response handler
response = handler(request, **kwargs)
if isawaitable(response):
response = await response
if response:
response = await request.respond(response)
else: