Skip to content

Commit c91b081

Browse files
mkuznetsCarlton Gibson
authored and
Carlton Gibson
committed
Support URLPattern and URLResolver from Django 2.0 (#5500)
* Support URLPattern and URLResolver from Django 2.0 * fix import order
1 parent e39d933 commit c91b081

File tree

4 files changed

+30
-9
lines changed

4 files changed

+30
-9
lines changed

rest_framework/compat.py

+22-1
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,35 @@
2525

2626
try:
2727
from django.urls import (
28-
NoReverseMatch, RegexURLPattern, RegexURLResolver, ResolverMatch, Resolver404, get_script_prefix, reverse, reverse_lazy, resolve
28+
NoReverseMatch, URLPattern as RegexURLPattern, URLResolver as RegexURLResolver, ResolverMatch, Resolver404, get_script_prefix, reverse, reverse_lazy, resolve
2929
)
30+
3031
except ImportError:
3132
from django.core.urlresolvers import ( # Will be removed in Django 2.0
3233
NoReverseMatch, RegexURLPattern, RegexURLResolver, ResolverMatch, Resolver404, get_script_prefix, reverse, reverse_lazy, resolve
3334
)
3435

3536

37+
def get_regex_pattern(urlpattern):
38+
if hasattr(urlpattern, 'pattern'):
39+
# Django 2.0
40+
return urlpattern.pattern.regex.pattern
41+
else:
42+
# Django < 2.0
43+
return urlpattern.regex.pattern
44+
45+
46+
def make_url_resolver(regex, urlpatterns):
47+
try:
48+
# Django 2.0
49+
from django.urls.resolvers import RegexPattern
50+
return RegexURLResolver(RegexPattern(regex), urlpatterns)
51+
52+
except ImportError:
53+
# Django < 2.0
54+
return RegexURLResolver(regex, urlpatterns)
55+
56+
3657
try:
3758
import urlparse # Python 2.x
3859
except ImportError:

rest_framework/schemas/generators.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
from rest_framework import exceptions
1717
from rest_framework.compat import (
18-
RegexURLPattern, RegexURLResolver, coreapi, coreschema
18+
RegexURLPattern, RegexURLResolver, coreapi, coreschema, get_regex_pattern
1919
)
2020
from rest_framework.request import clone_request
2121
from rest_framework.settings import api_settings
@@ -135,7 +135,7 @@ def get_api_endpoints(self, patterns=None, prefix=''):
135135
api_endpoints = []
136136

137137
for pattern in patterns:
138-
path_regex = prefix + pattern.regex.pattern
138+
path_regex = prefix + get_regex_pattern(pattern)
139139
if isinstance(pattern, RegexURLPattern):
140140
path = self.get_path_from_regex(path_regex)
141141
callback = pattern.callback

rest_framework/urlpatterns.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from django.conf.urls import include, url
44

5-
from rest_framework.compat import RegexURLResolver
5+
from rest_framework.compat import RegexURLResolver, get_regex_pattern
66
from rest_framework.settings import api_settings
77

88

@@ -11,7 +11,7 @@ def apply_suffix_patterns(urlpatterns, suffix_pattern, suffix_required):
1111
for urlpattern in urlpatterns:
1212
if isinstance(urlpattern, RegexURLResolver):
1313
# Set of included URL patterns
14-
regex = urlpattern.regex.pattern
14+
regex = get_regex_pattern(urlpattern)
1515
namespace = urlpattern.namespace
1616
app_name = urlpattern.app_name
1717
kwargs = urlpattern.default_kwargs
@@ -22,7 +22,7 @@ def apply_suffix_patterns(urlpatterns, suffix_pattern, suffix_required):
2222
ret.append(url(regex, include((patterns, app_name), namespace), kwargs))
2323
else:
2424
# Regular URL pattern
25-
regex = urlpattern.regex.pattern.rstrip('$').rstrip('/') + suffix_pattern
25+
regex = get_regex_pattern(urlpattern).rstrip('$').rstrip('/') + suffix_pattern
2626
view = urlpattern.callback
2727
kwargs = urlpattern.default_args
2828
name = urlpattern.name

tests/test_urlpatterns.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from django.conf.urls import include, url
66
from django.test import TestCase
77

8-
from rest_framework.compat import RegexURLResolver, Resolver404
8+
from rest_framework.compat import Resolver404, make_url_resolver
99
from rest_framework.test import APIRequestFactory
1010
from rest_framework.urlpatterns import format_suffix_patterns
1111

@@ -28,7 +28,7 @@ def _resolve_urlpatterns(self, urlpatterns, test_paths):
2828
urlpatterns = format_suffix_patterns(urlpatterns)
2929
except Exception:
3030
self.fail("Failed to apply `format_suffix_patterns` on the supplied urlpatterns")
31-
resolver = RegexURLResolver(r'^/', urlpatterns)
31+
resolver = make_url_resolver(r'^/', urlpatterns)
3232
for test_path in test_paths:
3333
request = factory.get(test_path.path)
3434
try:
@@ -43,7 +43,7 @@ def test_trailing_slash(self):
4343
urlpatterns = format_suffix_patterns([
4444
url(r'^test/$', dummy_view),
4545
])
46-
resolver = RegexURLResolver(r'^/', urlpatterns)
46+
resolver = make_url_resolver(r'^/', urlpatterns)
4747

4848
test_paths = [
4949
(URLTestPath('/test.api', (), {'format': 'api'}), True),

0 commit comments

Comments
 (0)