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 pass
class ParameterNameConflicts(Exception):
pass
class Router: class Router:
"""Router supports basic routing with parameters and method checks """Router supports basic routing with parameters and method checks
@ -195,12 +199,17 @@ class Router:
methods = frozenset(methods) methods = frozenset(methods)
parameters = [] parameters = []
parameter_names = set()
properties = {"unhashable": None} properties = {"unhashable": None}
def add_parameter(match): def add_parameter(match):
name = match.group(1) name = match.group(1)
name, _type, pattern = self.parse_parameter_string(name) 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( parameter = Parameter(
name=name, cast=_type) name=name, cast=_type)
parameters.append(parameter) parameters.append(parameter)

View File

@ -3,7 +3,7 @@ import pytest
from sanic import Sanic from sanic import Sanic
from sanic.response import text, json 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 from sanic.constants import HTTP_METHODS
@ -935,3 +935,10 @@ def test_uri_with_different_method_and_different_params(app):
assert response.json == { assert response.json == {
'action': 'post' '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')