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:
36
sanic/app.py
36
sanic/app.py
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user