Skip to content

Expandable routes have more priority than static routes when adding a trailing slash to the path #79

@javierdialpad

Description

@javierdialpad

Problem

There seems to be an unexpected behavior when mixing paths with trailing slashes and a route with a path/regex parameter. When creating an app with strict_slashes=False, one would expect that static routes will match paths with and without the trailing slash as a top priority. But paths with a trailing slash are actually a "last resource" when looking for a matching route.

Code snippet

from sanic import Sanic, response

app = Sanic("MyApp", strict_slashes=False)


async def hello_world(request, *args, **kwargs):
  return response.text('Hello World!')


async def catch_all(request, path):
  return response.text(f'Caught one: {path}')


app.add_route(hello_world, '/hello/')  # same behavior using '/hello'
app.add_route(catch_all, '/<path:path>')

if __name__ == '__main__':
  app.run(port=8080)

Expected behavior

Because strict_slashes=False, the hello_world route is supposed to match both /hello and /hello/. But the latter is being matched with the catch_all route.

Looks like this is happening due to how the resolve method works rigt now: https://github.com/sanic-org/sanic-routing/blob/main/sanic_routing/router.py#L92; it's looking for the route with the trailing slash only when no other route would match.

Sanic version

  • Sanic v23.6.0
  • sanic-routing==23.6.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions