raise exception when param conflicts in route

This commit is contained in:
Yun Xu 2018-10-12 22:57:56 -07:00
parent 63182f55f7
commit c8c370b784
2 changed files with 17 additions and 1 deletions

View File

@ -38,6 +38,10 @@ class RouteDoesNotExist(Exception):
pass
class ParameterNameConflicts(Exception):
pass
class Router:
"""Router supports basic routing with parameters and method checks
@ -195,12 +199,17 @@ class Router:
methods = frozenset(methods)
parameters = []
parameter_names = set()
properties = {"unhashable": None}
def add_parameter(match):
name = match.group(1)
name, _type, pattern = self.parse_parameter_string(name)
if name in parameter_names:
raise ParameterNameConflicts("Multiple parameter named <{name}> in route uri {uri}".format(name=name, uri=uri))
parameter_names.add(name)
parameter = Parameter(
name=name, cast=_type)
parameters.append(parameter)

View File

@ -3,7 +3,7 @@ import pytest
from sanic import Sanic
from sanic.response import text, json
from sanic.router import RouteExists, RouteDoesNotExist
from sanic.router import RouteExists, RouteDoesNotExist, ParameterNameConflicts
from sanic.constants import HTTP_METHODS
@ -935,3 +935,10 @@ def test_uri_with_different_method_and_different_params(app):
assert response.json == {
'action': 'post'
}
def test_route_raise_ParameterNameConflicts(app):
with pytest.raises(ParameterNameConflicts):
@app.get('/api/v1/<user>/<user>/')
def handler(request, user):
return text('OK')