Add path type for router

This commit is contained in:
messense 2017-04-13 11:34:35 +08:00
parent 63fe7c0a86
commit 35b92e1511
No known key found for this signature in database
GPG Key ID: BB41A8A2C716CCA9
2 changed files with 29 additions and 3 deletions

View File

@ -16,6 +16,7 @@ REGEX_TYPES = {
'int': (int, r'\d+'), 'int': (int, r'\d+'),
'number': (float, r'[0-9\\.]+'), 'number': (float, r'[0-9\\.]+'),
'alpha': (str, r'[A-Za-z]+'), 'alpha': (str, r'[A-Za-z]+'),
'path': (str, r'[^/].*?'),
} }
ROUTER_CACHE_SIZE = 1024 ROUTER_CACHE_SIZE = 1024
@ -71,7 +72,8 @@ class Router:
self.routes_always_check = [] self.routes_always_check = []
self.hosts = set() self.hosts = set()
def parse_parameter_string(self, parameter_string): @classmethod
def parse_parameter_string(cls, parameter_string):
"""Parse a parameter string into its constituent name, type, and """Parse a parameter string into its constituent name, type, and
pattern pattern
@ -161,10 +163,10 @@ class Router:
parameters.append(parameter) parameters.append(parameter)
# Mark the whole route as unhashable if it has the hash key in it # Mark the whole route as unhashable if it has the hash key in it
if re.search('(^|[^^]){1}/', pattern): if re.search(r'(^|[^^]){1}/', pattern):
properties['unhashable'] = True properties['unhashable'] = True
# Mark the route as unhashable if it matches the hash key # Mark the route as unhashable if it matches the hash key
elif re.search(pattern, '/'): elif re.search(r'/', pattern):
properties['unhashable'] = True properties['unhashable'] = True
return '({})'.format(pattern) return '({})'.format(pattern)

View File

@ -238,6 +238,30 @@ def test_dynamic_route_regex():
assert response.status == 200 assert response.status == 200
def test_dynamic_route_path():
app = Sanic('test_dynamic_route_path')
@app.route('/<path:path>/info')
async def handler(request, path):
return text('OK')
request, response = app.test_client.get('/path/1/info')
assert response.status == 200
request, response = app.test_client.get('/info')
assert response.status == 404
@app.route('/<path:path>')
async def handler1(request, path):
return text('OK')
request, response = app.test_client.get('/info')
assert response.status == 200
request, response = app.test_client.get('/whatever/you/set')
assert response.status == 200
def test_dynamic_route_unhashable(): def test_dynamic_route_unhashable():
app = Sanic('test_dynamic_route_unhashable') app = Sanic('test_dynamic_route_unhashable')