Handle duplicate urls in urlconf (#155)
Django resolves urls in order from top to bottom, and only uses the first matching URL found.
This commit is contained in:
committed by
Cristi Vîjdea
parent
696ec3a94a
commit
544d72db0a
@@ -72,7 +72,7 @@ class EndpointEnumerator(_EndpointEnumerator):
|
||||
|
||||
return path
|
||||
|
||||
def get_api_endpoints(self, patterns=None, prefix='', app_name=None, namespace=None):
|
||||
def get_api_endpoints(self, patterns=None, prefix='', app_name=None, namespace=None, previously_seen_endpoints=None):
|
||||
"""
|
||||
Return a list of all available API endpoints by inspecting the URL conf.
|
||||
|
||||
@@ -82,6 +82,8 @@ class EndpointEnumerator(_EndpointEnumerator):
|
||||
patterns = self.patterns
|
||||
|
||||
api_endpoints = []
|
||||
if previously_seen_endpoints is None:
|
||||
previously_seen_endpoints = set()
|
||||
|
||||
for pattern in patterns:
|
||||
path_regex = prefix + get_original_route(pattern)
|
||||
@@ -92,6 +94,13 @@ class EndpointEnumerator(_EndpointEnumerator):
|
||||
url_name = pattern.name
|
||||
if self.should_include_endpoint(path, callback, app_name or '', namespace or '', url_name):
|
||||
path = self.replace_version(path, callback)
|
||||
|
||||
# avoid adding endpoints that have already been seen,
|
||||
# as Django resolves urls in top-down order
|
||||
if path in previously_seen_endpoints:
|
||||
continue
|
||||
previously_seen_endpoints.add(path)
|
||||
|
||||
for method in self.get_allowed_methods(callback):
|
||||
endpoint = (path, method, callback)
|
||||
api_endpoints.append(endpoint)
|
||||
@@ -103,7 +112,8 @@ class EndpointEnumerator(_EndpointEnumerator):
|
||||
patterns=pattern.url_patterns,
|
||||
prefix=path_regex,
|
||||
app_name="%s:%s" % (app_name, pattern.app_name) if app_name else pattern.app_name,
|
||||
namespace="%s:%s" % (namespace, pattern.namespace) if namespace else pattern.namespace
|
||||
namespace="%s:%s" % (namespace, pattern.namespace) if namespace else pattern.namespace,
|
||||
previously_seen_endpoints=previously_seen_endpoints
|
||||
)
|
||||
api_endpoints.extend(nested_endpoints)
|
||||
else:
|
||||
|
||||
Reference in New Issue
Block a user