Add get_original_route to complement get_regex_pattern

This commit is contained in:
Cristi Vîjdea 2017-12-20 11:04:56 +01:00
parent 426eb90782
commit 63ee414e3c
2 changed files with 20 additions and 3 deletions

View File

@ -29,7 +29,11 @@ except ImportError:
) )
def get_regex_pattern(urlpattern): def get_original_route(urlpattern):
"""
Get the original route/regex that was typed in by the user into the path(), re_path() or url() directive. This
is in contrast with get_regex_pattern below, which for RoutePattern returns the raw regex generated from the path().
"""
if hasattr(urlpattern, 'pattern'): if hasattr(urlpattern, 'pattern'):
# Django 2.0 # Django 2.0
return str(urlpattern.pattern) return str(urlpattern.pattern)
@ -38,6 +42,19 @@ def get_regex_pattern(urlpattern):
return urlpattern.regex.pattern return urlpattern.regex.pattern
def get_regex_pattern(urlpattern):
"""
Get the raw regex out of the urlpattern's RegexPattern or RoutePattern. This is always a regular expression,
unlike get_original_route above.
"""
if hasattr(urlpattern, 'pattern'):
# Django 2.0
return urlpattern.pattern.regex.pattern
else:
# Django < 2.0
return urlpattern.regex.pattern
def make_url_resolver(regex, urlpatterns): def make_url_resolver(regex, urlpatterns):
try: try:
# Django 2.0 # Django 2.0

View File

@ -16,7 +16,7 @@ from django.utils import six
from rest_framework import exceptions from rest_framework import exceptions
from rest_framework.compat import ( from rest_framework.compat import (
URLPattern, URLResolver, coreapi, coreschema, get_regex_pattern URLPattern, URLResolver, coreapi, coreschema, get_original_route
) )
from rest_framework.request import clone_request from rest_framework.request import clone_request
from rest_framework.settings import api_settings from rest_framework.settings import api_settings
@ -170,7 +170,7 @@ class EndpointEnumerator(object):
api_endpoints = [] api_endpoints = []
for pattern in patterns: for pattern in patterns:
path_regex = prefix + get_regex_pattern(pattern) path_regex = prefix + get_original_route(pattern)
if isinstance(pattern, URLPattern): if isinstance(pattern, URLPattern):
path = self.get_path_from_regex(path_regex) path = self.get_path_from_regex(path_regex)
callback = pattern.callback callback = pattern.callback