used path and re_path for urls

This commit is contained in:
Asif Saif Uddin (Auvi) 2019-09-20 14:42:19 +06:00
parent 8c4e83c5df
commit c436b8ab00
8 changed files with 110 additions and 66 deletions

View File

@ -11,11 +11,15 @@ your API requires authentication:
You should make sure your authentication settings include `SessionAuthentication`. You should make sure your authentication settings include `SessionAuthentication`.
""" """
from django.conf.urls import url from django.urls import path
from django.contrib.auth import views from django.contrib.auth import views
app_name = 'rest_framework' app_name = 'rest_framework'
urlpatterns = [ urlpatterns = [
url(r'^login/$', views.LoginView.as_view(template_name='rest_framework/login.html'), name='login'), path(
url(r'^logout/$', views.LogoutView.as_view(), name='logout'), 'login/',
views.LoginView.as_view(template_name='rest_framework/login.html'),
name='login'
),
path('logout/', views.LogoutView.as_view(), name='logout'),
] ]

View File

@ -2,11 +2,10 @@ import warnings
from collections import namedtuple from collections import namedtuple
import pytest import pytest
from django.conf.urls import include, url
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.db import models from django.db import models
from django.test import TestCase, override_settings from django.test import TestCase, override_settings
from django.urls import resolve, reverse from django.urls import resolve, reverse, include, path
from rest_framework import ( from rest_framework import (
RemovedInDRF311Warning, permissions, serializers, viewsets RemovedInDRF311Warning, permissions, serializers, viewsets
@ -122,7 +121,7 @@ class TestSimpleRouter(URLPatternsTestCase, TestCase):
router.register('basics', BasicViewSet, basename='basic') router.register('basics', BasicViewSet, basename='basic')
urlpatterns = [ urlpatterns = [
url(r'^api/', include(router.urls)), path('api/', include(router.urls)),
] ]
def setUp(self): def setUp(self):
@ -167,8 +166,13 @@ class TestSimpleRouter(URLPatternsTestCase, TestCase):
class TestRootView(URLPatternsTestCase, TestCase): class TestRootView(URLPatternsTestCase, TestCase):
urlpatterns = [ urlpatterns = [
url(r'^non-namespaced/', include(namespaced_router.urls)), path('non-namespaced/', include(namespaced_router.urls)),
url(r'^namespaced/', include((namespaced_router.urls, 'namespaced'), namespace='namespaced')), path(
'namespaced/',
include(
(namespaced_router.urls, 'namespaced'),
namespace='namespaced')
),
] ]
def test_retrieve_namespaced_root(self): def test_retrieve_namespaced_root(self):
@ -185,8 +189,8 @@ class TestCustomLookupFields(URLPatternsTestCase, TestCase):
Ensure that custom lookup fields are correctly routed. Ensure that custom lookup fields are correctly routed.
""" """
urlpatterns = [ urlpatterns = [
url(r'^example/', include(notes_router.urls)), path('example/', include(notes_router.urls)),
url(r'^example2/', include(kwarged_notes_router.urls)), path('example2/', include(kwarged_notes_router.urls)),
] ]
def setUp(self): def setUp(self):
@ -243,8 +247,8 @@ class TestLookupUrlKwargs(URLPatternsTestCase, TestCase):
Setup a deep lookup_field, but map it to a simple URL kwarg. Setup a deep lookup_field, but map it to a simple URL kwarg.
""" """
urlpatterns = [ urlpatterns = [
url(r'^example/', include(notes_router.urls)), path('example/', include(notes_router.urls)),
url(r'^example2/', include(kwarged_notes_router.urls)), path('example2/', include(kwarged_notes_router.urls)),
] ]
def setUp(self): def setUp(self):

View File

@ -1,6 +1,6 @@
from io import BytesIO from io import BytesIO
from django.conf.urls import url from django.urls import path
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.shortcuts import redirect from django.shortcuts import redirect
from django.test import TestCase, override_settings from django.test import TestCase, override_settings
@ -47,10 +47,10 @@ def post_view(request):
urlpatterns = [ urlpatterns = [
url(r'^view/$', view), path('view/', view),
url(r'^session-view/$', session_view), path('session-view/', session_view),
url(r'^redirect-view/$', redirect_view), path('redirect-view/', redirect_view),
url(r'^post-view/$', post_view) path('post-view/', post_view)
] ]
@ -284,7 +284,7 @@ class TestAPIRequestFactory(TestCase):
class TestUrlPatternTestCase(URLPatternsTestCase): class TestUrlPatternTestCase(URLPatternsTestCase):
urlpatterns = [ urlpatterns = [
url(r'^$', view), path('', view),
] ]
@classmethod @classmethod

View File

@ -1,11 +1,10 @@
import unittest import unittest
from collections import namedtuple from collections import namedtuple
from django.conf.urls import include, url from django.urls import include, path, re_path, include, Resolver404
from django.test import TestCase from django.test import TestCase
from django.urls import Resolver404
from rest_framework.compat import make_url_resolver, path, re_path from rest_framework.compat import make_url_resolver,
from rest_framework.test import APIRequestFactory from rest_framework.test import APIRequestFactory
from rest_framework.urlpatterns import format_suffix_patterns from rest_framework.urlpatterns import format_suffix_patterns
@ -62,7 +61,7 @@ class FormatSuffixTests(TestCase):
def test_trailing_slash(self): def test_trailing_slash(self):
urlpatterns = [ urlpatterns = [
url(r'^test/$', dummy_view), path('test/', dummy_view),
] ]
self._test_trailing_slash(urlpatterns) self._test_trailing_slash(urlpatterns)
@ -83,7 +82,7 @@ class FormatSuffixTests(TestCase):
def test_format_suffix(self): def test_format_suffix(self):
urlpatterns = [ urlpatterns = [
url(r'^test$', dummy_view), path('test/', dummy_view),
] ]
self._test_format_suffix(urlpatterns) self._test_format_suffix(urlpatterns)
@ -120,7 +119,7 @@ class FormatSuffixTests(TestCase):
def test_default_args(self): def test_default_args(self):
urlpatterns = [ urlpatterns = [
url(r'^test$', dummy_view, {'foo': 'bar'}), path('test/', dummy_view, {'foo': 'bar'}),
] ]
self._test_default_args(urlpatterns) self._test_default_args(urlpatterns)
@ -141,10 +140,10 @@ class FormatSuffixTests(TestCase):
def test_included_urls(self): def test_included_urls(self):
nested_patterns = [ nested_patterns = [
url(r'^path$', dummy_view) path('path/', dummy_view)
] ]
urlpatterns = [ urlpatterns = [
url(r'^test/', include(nested_patterns), {'foo': 'bar'}), path('test/', include(nested_patterns), {'foo': 'bar'}),
] ]
self._test_included_urls(urlpatterns) self._test_included_urls(urlpatterns)
@ -164,7 +163,7 @@ class FormatSuffixTests(TestCase):
path('path', dummy_view) path('path', dummy_view)
] ]
urlpatterns = [ urlpatterns = [
url('^test/', include(nested_patterns), {'foo': 'bar'}), path('test/', include(nested_patterns), {'foo': 'bar'}),
] ]
self._test_included_urls(urlpatterns) self._test_included_urls(urlpatterns)
@ -172,11 +171,17 @@ class FormatSuffixTests(TestCase):
def test_included_urls_django2_mixed_args(self): def test_included_urls_django2_mixed_args(self):
nested_patterns = [ nested_patterns = [
path('path/<int:child>', dummy_view), path('path/<int:child>', dummy_view),
url('^url/(?P<child>[0-9]+)$', dummy_view) re_path('^url/(?P<child>[0-9]+)$', dummy_view)
] ]
urlpatterns = [ urlpatterns = [
url('^purl/(?P<parent>[0-9]+)/', include(nested_patterns), {'foo': 'bar'}), re_path(
path('ppath/<int:parent>/', include(nested_patterns), {'foo': 'bar'}), '^purl/(?P<parent>[0-9]+)/',
include(nested_patterns),
{'foo': 'bar'}),
path(
'ppath/<int:parent>/',
include(nested_patterns),
{'foo': 'bar'}),
] ]
test_paths = [ test_paths = [
# parent url() nesting child path() # parent url() nesting child path()
@ -212,7 +217,7 @@ class FormatSuffixTests(TestCase):
def test_allowed_formats(self): def test_allowed_formats(self):
urlpatterns = [ urlpatterns = [
url('^test$', dummy_view), path('test/', dummy_view),
] ]
self._test_allowed_formats(urlpatterns) self._test_allowed_formats(urlpatterns)

View File

@ -1,6 +1,6 @@
from unittest import mock from unittest import mock
from django.conf.urls import url from django.urls import path, re_path
from django.test import TestCase, override_settings from django.test import TestCase, override_settings
from rest_framework.decorators import action from rest_framework.decorators import action
@ -64,12 +64,17 @@ class ResourceViewSet(ModelViewSet):
router = SimpleRouter() router = SimpleRouter()
router.register(r'resources', ResourceViewSet) router.register(r'resources', ResourceViewSet)
urlpatterns = [ urlpatterns = [
url(r'^$', Root.as_view()), path('', Root.as_view()),
url(r'^resource/$', ResourceRoot.as_view()), path('resource/', ResourceRoot.as_view()),
url(r'^resource/customname$', CustomNameResourceInstance.as_view()), path('resource/customname/', CustomNameResourceInstance.as_view()),
url(r'^resource/(?P<key>[0-9]+)$', ResourceInstance.as_view()), re_path(
url(r'^resource/(?P<key>[0-9]+)/$', NestedResourceRoot.as_view()), r'^resource/(?P<key>[0-9]+)$',
url(r'^resource/(?P<key>[0-9]+)/(?P<other>[A-Za-z]+)$', NestedResourceInstance.as_view()), ResourceInstance.as_view()),
re_path(r'^resource/(?P<key>[0-9]+)/$', NestedResourceRoot.as_view()),
re_path(
r'^resource/(?P<key>[0-9]+)/(?P<other>[A-Za-z]+)$',
NestedResourceInstance.as_view()
),
] ]
urlpatterns += router.urls urlpatterns += router.urls

View File

@ -1,5 +1,5 @@
import pytest import pytest
from django.conf.urls import include, url from django.urls import include, path, re_path
from django.test import override_settings from django.test import override_settings
from rest_framework import serializers, status, versioning from rest_framework import serializers, status, versioning
@ -101,7 +101,8 @@ class TestRequestVersion:
scheme = versioning.AcceptHeaderVersioning scheme = versioning.AcceptHeaderVersioning
view = RequestVersionView.as_view(versioning_class=scheme) view = RequestVersionView.as_view(versioning_class=scheme)
request = factory.get('/endpoint/', HTTP_ACCEPT='application/json; version=1.2.3') request = factory.get(
'/endpoint/', HTTP_ACCEPT='application/json; version=1.2.3')
response = view(request) response = view(request)
assert response.data == {'version': '1.2.3'} assert response.data == {'version': '1.2.3'}
@ -144,14 +145,20 @@ class TestRequestVersion:
class TestURLReversing(URLPatternsTestCase, APITestCase): class TestURLReversing(URLPatternsTestCase, APITestCase):
included = [ included = [
url(r'^namespaced/$', dummy_view, name='another'), path('namespaced/', dummy_view, name='another'),
url(r'^example/(?P<pk>\d+)/$', dummy_pk_view, name='example-detail') re_path(
r'^example/(?P<pk>\d+)/$',
dummy_pk_view,
name='example-detail')
] ]
urlpatterns = [ urlpatterns = [
url(r'^v1/', include((included, 'v1'), namespace='v1')), path('v1/', include((included, 'v1'), namespace='v1')),
url(r'^another/$', dummy_view, name='another'), path('another/', dummy_view, name='another'),
url(r'^(?P<version>[v1|v2]+)/another/$', dummy_view, name='another'), re_path(
r'^(?P<version>[v1|v2]+)/another/$',
dummy_view,
name='another'),
] ]
def test_reverse_unversioned(self): def test_reverse_unversioned(self):
@ -167,7 +174,8 @@ class TestURLReversing(URLPatternsTestCase, APITestCase):
request = factory.get('/endpoint/?version=v1') request = factory.get('/endpoint/?version=v1')
response = view(request) response = view(request)
assert response.data == {'url': 'http://testserver/another/?version=v1'} assert response.data == {
'url': 'http://testserver/another/?version=v1'}
request = factory.get('/endpoint/') request = factory.get('/endpoint/')
response = view(request) response = view(request)
@ -237,7 +245,8 @@ class TestInvalidVersion:
scheme = versioning.AcceptHeaderVersioning scheme = versioning.AcceptHeaderVersioning
view = AllowedVersionsView.as_view(versioning_class=scheme) view = AllowedVersionsView.as_view(versioning_class=scheme)
request = factory.get('/endpoint/', HTTP_ACCEPT='application/json; version=v3') request = factory.get(
'/endpoint/', HTTP_ACCEPT='application/json; version=v3')
response = view(request) response = view(request)
assert response.status_code == status.HTTP_406_NOT_ACCEPTABLE assert response.status_code == status.HTTP_406_NOT_ACCEPTABLE
@ -300,7 +309,8 @@ class TestAllowedAndDefaultVersion:
def test_missing_with_default_and_none_allowed(self): def test_missing_with_default_and_none_allowed(self):
scheme = versioning.AcceptHeaderVersioning scheme = versioning.AcceptHeaderVersioning
view = AllowedWithNoneAndDefaultVersionsView.as_view(versioning_class=scheme) view = AllowedWithNoneAndDefaultVersionsView.as_view(
versioning_class=scheme)
request = factory.get('/endpoint/', HTTP_ACCEPT='application/json') request = factory.get('/endpoint/', HTTP_ACCEPT='application/json')
response = view(request) response = view(request)
@ -310,12 +320,15 @@ class TestAllowedAndDefaultVersion:
class TestHyperlinkedRelatedField(URLPatternsTestCase, APITestCase): class TestHyperlinkedRelatedField(URLPatternsTestCase, APITestCase):
included = [ included = [
url(r'^namespaced/(?P<pk>\d+)/$', dummy_pk_view, name='namespaced'), re_path(
r'^namespaced/(?P<pk>\d+)/$',
dummy_pk_view,
name='namespaced'),
] ]
urlpatterns = [ urlpatterns = [
url(r'^v1/', include((included, 'v1'), namespace='v1')), path('v1/', include((included, 'v1'), namespace='v1')),
url(r'^v2/', include((included, 'v2'), namespace='v2')) path('v2/', include((included, 'v2'), namespace='v2'))
] ]
def setUp(self): def setUp(self):
@ -342,17 +355,25 @@ class TestHyperlinkedRelatedField(URLPatternsTestCase, APITestCase):
class TestNamespaceVersioningHyperlinkedRelatedFieldScheme(URLPatternsTestCase, APITestCase): class TestNamespaceVersioningHyperlinkedRelatedFieldScheme(URLPatternsTestCase, APITestCase):
nested = [ nested = [
url(r'^namespaced/(?P<pk>\d+)/$', dummy_pk_view, name='nested'), re_path(r'^namespaced/(?P<pk>\d+)/$', dummy_pk_view, name='nested'),
] ]
included = [ included = [
url(r'^namespaced/(?P<pk>\d+)/$', dummy_pk_view, name='namespaced'), re_path(
url(r'^nested/', include((nested, 'nested-namespace'), namespace='nested-namespace')) r'^namespaced/(?P<pk>\d+)/$',
dummy_pk_view,
name='namespaced'),
path(
'nested/',
include(
(nested, 'nested-namespace'),
namespace='nested-namespace')
)
] ]
urlpatterns = [ urlpatterns = [
url(r'^v1/', include((included, 'restframeworkv1'), namespace='v1')), path('v1/', include((included, 'restframeworkv1'), namespace='v1')),
url(r'^v2/', include((included, 'restframeworkv2'), namespace='v2')), path('v2/', include((included, 'restframeworkv2'), namespace='v2')),
url(r'^non-api/(?P<pk>\d+)/$', dummy_pk_view, name='non-api-view') re_path(r'^non-api/(?P<pk>\d+)/$', dummy_pk_view, name='non-api-view')
] ]
def _create_field(self, view_name, version): def _create_field(self, view_name, version):
@ -368,22 +389,27 @@ class TestNamespaceVersioningHyperlinkedRelatedFieldScheme(URLPatternsTestCase,
def test_api_url_is_properly_reversed_with_v1(self): def test_api_url_is_properly_reversed_with_v1(self):
field = self._create_field('namespaced', 'v1') field = self._create_field('namespaced', 'v1')
assert field.to_representation(PKOnlyObject(3)) == 'http://testserver/v1/namespaced/3/' assert field.to_representation(PKOnlyObject(
3)) == 'http://testserver/v1/namespaced/3/'
def test_api_url_is_properly_reversed_with_v2(self): def test_api_url_is_properly_reversed_with_v2(self):
field = self._create_field('namespaced', 'v2') field = self._create_field('namespaced', 'v2')
assert field.to_representation(PKOnlyObject(5)) == 'http://testserver/v2/namespaced/5/' assert field.to_representation(PKOnlyObject(
5)) == 'http://testserver/v2/namespaced/5/'
def test_api_url_is_properly_reversed_with_nested(self): def test_api_url_is_properly_reversed_with_nested(self):
field = self._create_field('nested', 'v1:nested-namespace') field = self._create_field('nested', 'v1:nested-namespace')
assert field.to_representation(PKOnlyObject(3)) == 'http://testserver/v1/nested/namespaced/3/' assert field.to_representation(PKOnlyObject(
3)) == 'http://testserver/v1/nested/namespaced/3/'
def test_non_api_url_is_properly_reversed_regardless_of_the_version(self): def test_non_api_url_is_properly_reversed_regardless_of_the_version(self):
""" """
Regression test for #2711 Regression test for #2711
""" """
field = self._create_field('non-api-view', 'v1') field = self._create_field('non-api-view', 'v1')
assert field.to_representation(PKOnlyObject(10)) == 'http://testserver/non-api/10/' assert field.to_representation(PKOnlyObject(
10)) == 'http://testserver/non-api/10/'
field = self._create_field('non-api-view', 'v2') field = self._create_field('non-api-view', 'v2')
assert field.to_representation(PKOnlyObject(10)) == 'http://testserver/non-api/10/' assert field.to_representation(PKOnlyObject(
10)) == 'http://testserver/non-api/10/'

View File

@ -1,7 +1,7 @@
from collections import OrderedDict from collections import OrderedDict
import pytest import pytest
from django.conf.urls import include, url from django.urls import include, path, re_path
from django.db import models from django.db import models
from django.test import TestCase, override_settings from django.test import TestCase, override_settings
@ -88,7 +88,7 @@ router.register(r'names', ActionNamesViewSet, basename='names')
urlpatterns = [ urlpatterns = [
url(r'^api/', include(router.urls)), path('api/', include(router.urls)),
] ]

View File

@ -3,14 +3,14 @@ URLConf for test suite.
We need only the docs urls for DocumentationRenderer tests. We need only the docs urls for DocumentationRenderer tests.
""" """
from django.conf.urls import url from django.urls import path
from rest_framework.compat import coreapi from rest_framework.compat import coreapi
from rest_framework.documentation import include_docs_urls from rest_framework.documentation import include_docs_urls
if coreapi: if coreapi:
urlpatterns = [ urlpatterns = [
url(r'^docs/', include_docs_urls(title='Test Suite API')), path('docs/', include_docs_urls(title='Test Suite API')),
] ]
else: else:
urlpatterns = [] urlpatterns = []