mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-07-28 08:59:54 +03:00
used path and re_path for urls
This commit is contained in:
parent
8c4e83c5df
commit
c436b8ab00
|
@ -11,11 +11,15 @@ your API requires authentication:
|
|||
|
||||
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
|
||||
|
||||
app_name = 'rest_framework'
|
||||
urlpatterns = [
|
||||
url(r'^login/$', views.LoginView.as_view(template_name='rest_framework/login.html'), name='login'),
|
||||
url(r'^logout/$', views.LogoutView.as_view(), name='logout'),
|
||||
path(
|
||||
'login/',
|
||||
views.LoginView.as_view(template_name='rest_framework/login.html'),
|
||||
name='login'
|
||||
),
|
||||
path('logout/', views.LogoutView.as_view(), name='logout'),
|
||||
]
|
||||
|
|
|
@ -2,11 +2,10 @@ import warnings
|
|||
from collections import namedtuple
|
||||
|
||||
import pytest
|
||||
from django.conf.urls import include, url
|
||||
from django.core.exceptions import ImproperlyConfigured
|
||||
from django.db import models
|
||||
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 (
|
||||
RemovedInDRF311Warning, permissions, serializers, viewsets
|
||||
|
@ -122,7 +121,7 @@ class TestSimpleRouter(URLPatternsTestCase, TestCase):
|
|||
router.register('basics', BasicViewSet, basename='basic')
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^api/', include(router.urls)),
|
||||
path('api/', include(router.urls)),
|
||||
]
|
||||
|
||||
def setUp(self):
|
||||
|
@ -167,8 +166,13 @@ class TestSimpleRouter(URLPatternsTestCase, TestCase):
|
|||
|
||||
class TestRootView(URLPatternsTestCase, TestCase):
|
||||
urlpatterns = [
|
||||
url(r'^non-namespaced/', include(namespaced_router.urls)),
|
||||
url(r'^namespaced/', include((namespaced_router.urls, 'namespaced'), namespace='namespaced')),
|
||||
path('non-namespaced/', include(namespaced_router.urls)),
|
||||
path(
|
||||
'namespaced/',
|
||||
include(
|
||||
(namespaced_router.urls, 'namespaced'),
|
||||
namespace='namespaced')
|
||||
),
|
||||
]
|
||||
|
||||
def test_retrieve_namespaced_root(self):
|
||||
|
@ -185,8 +189,8 @@ class TestCustomLookupFields(URLPatternsTestCase, TestCase):
|
|||
Ensure that custom lookup fields are correctly routed.
|
||||
"""
|
||||
urlpatterns = [
|
||||
url(r'^example/', include(notes_router.urls)),
|
||||
url(r'^example2/', include(kwarged_notes_router.urls)),
|
||||
path('example/', include(notes_router.urls)),
|
||||
path('example2/', include(kwarged_notes_router.urls)),
|
||||
]
|
||||
|
||||
def setUp(self):
|
||||
|
@ -243,8 +247,8 @@ class TestLookupUrlKwargs(URLPatternsTestCase, TestCase):
|
|||
Setup a deep lookup_field, but map it to a simple URL kwarg.
|
||||
"""
|
||||
urlpatterns = [
|
||||
url(r'^example/', include(notes_router.urls)),
|
||||
url(r'^example2/', include(kwarged_notes_router.urls)),
|
||||
path('example/', include(notes_router.urls)),
|
||||
path('example2/', include(kwarged_notes_router.urls)),
|
||||
]
|
||||
|
||||
def setUp(self):
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from io import BytesIO
|
||||
|
||||
from django.conf.urls import url
|
||||
from django.urls import path
|
||||
from django.contrib.auth.models import User
|
||||
from django.shortcuts import redirect
|
||||
from django.test import TestCase, override_settings
|
||||
|
@ -47,10 +47,10 @@ def post_view(request):
|
|||
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^view/$', view),
|
||||
url(r'^session-view/$', session_view),
|
||||
url(r'^redirect-view/$', redirect_view),
|
||||
url(r'^post-view/$', post_view)
|
||||
path('view/', view),
|
||||
path('session-view/', session_view),
|
||||
path('redirect-view/', redirect_view),
|
||||
path('post-view/', post_view)
|
||||
]
|
||||
|
||||
|
||||
|
@ -284,7 +284,7 @@ class TestAPIRequestFactory(TestCase):
|
|||
|
||||
class TestUrlPatternTestCase(URLPatternsTestCase):
|
||||
urlpatterns = [
|
||||
url(r'^$', view),
|
||||
path('', view),
|
||||
]
|
||||
|
||||
@classmethod
|
||||
|
|
|
@ -1,11 +1,10 @@
|
|||
import unittest
|
||||
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.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.urlpatterns import format_suffix_patterns
|
||||
|
||||
|
@ -62,7 +61,7 @@ class FormatSuffixTests(TestCase):
|
|||
|
||||
def test_trailing_slash(self):
|
||||
urlpatterns = [
|
||||
url(r'^test/$', dummy_view),
|
||||
path('test/', dummy_view),
|
||||
]
|
||||
self._test_trailing_slash(urlpatterns)
|
||||
|
||||
|
@ -83,7 +82,7 @@ class FormatSuffixTests(TestCase):
|
|||
|
||||
def test_format_suffix(self):
|
||||
urlpatterns = [
|
||||
url(r'^test$', dummy_view),
|
||||
path('test/', dummy_view),
|
||||
]
|
||||
self._test_format_suffix(urlpatterns)
|
||||
|
||||
|
@ -120,7 +119,7 @@ class FormatSuffixTests(TestCase):
|
|||
|
||||
def test_default_args(self):
|
||||
urlpatterns = [
|
||||
url(r'^test$', dummy_view, {'foo': 'bar'}),
|
||||
path('test/', dummy_view, {'foo': 'bar'}),
|
||||
]
|
||||
self._test_default_args(urlpatterns)
|
||||
|
||||
|
@ -141,10 +140,10 @@ class FormatSuffixTests(TestCase):
|
|||
|
||||
def test_included_urls(self):
|
||||
nested_patterns = [
|
||||
url(r'^path$', dummy_view)
|
||||
path('path/', dummy_view)
|
||||
]
|
||||
urlpatterns = [
|
||||
url(r'^test/', include(nested_patterns), {'foo': 'bar'}),
|
||||
path('test/', include(nested_patterns), {'foo': 'bar'}),
|
||||
]
|
||||
self._test_included_urls(urlpatterns)
|
||||
|
||||
|
@ -164,7 +163,7 @@ class FormatSuffixTests(TestCase):
|
|||
path('path', dummy_view)
|
||||
]
|
||||
urlpatterns = [
|
||||
url('^test/', include(nested_patterns), {'foo': 'bar'}),
|
||||
path('test/', include(nested_patterns), {'foo': 'bar'}),
|
||||
]
|
||||
self._test_included_urls(urlpatterns)
|
||||
|
||||
|
@ -172,11 +171,17 @@ class FormatSuffixTests(TestCase):
|
|||
def test_included_urls_django2_mixed_args(self):
|
||||
nested_patterns = [
|
||||
path('path/<int:child>', dummy_view),
|
||||
url('^url/(?P<child>[0-9]+)$', dummy_view)
|
||||
re_path('^url/(?P<child>[0-9]+)$', dummy_view)
|
||||
]
|
||||
urlpatterns = [
|
||||
url('^purl/(?P<parent>[0-9]+)/', include(nested_patterns), {'foo': 'bar'}),
|
||||
path('ppath/<int:parent>/', include(nested_patterns), {'foo': 'bar'}),
|
||||
re_path(
|
||||
'^purl/(?P<parent>[0-9]+)/',
|
||||
include(nested_patterns),
|
||||
{'foo': 'bar'}),
|
||||
path(
|
||||
'ppath/<int:parent>/',
|
||||
include(nested_patterns),
|
||||
{'foo': 'bar'}),
|
||||
]
|
||||
test_paths = [
|
||||
# parent url() nesting child path()
|
||||
|
@ -212,7 +217,7 @@ class FormatSuffixTests(TestCase):
|
|||
|
||||
def test_allowed_formats(self):
|
||||
urlpatterns = [
|
||||
url('^test$', dummy_view),
|
||||
path('test/', dummy_view),
|
||||
]
|
||||
self._test_allowed_formats(urlpatterns)
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
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 rest_framework.decorators import action
|
||||
|
@ -64,12 +64,17 @@ class ResourceViewSet(ModelViewSet):
|
|||
router = SimpleRouter()
|
||||
router.register(r'resources', ResourceViewSet)
|
||||
urlpatterns = [
|
||||
url(r'^$', Root.as_view()),
|
||||
url(r'^resource/$', ResourceRoot.as_view()),
|
||||
url(r'^resource/customname$', CustomNameResourceInstance.as_view()),
|
||||
url(r'^resource/(?P<key>[0-9]+)$', ResourceInstance.as_view()),
|
||||
url(r'^resource/(?P<key>[0-9]+)/$', NestedResourceRoot.as_view()),
|
||||
url(r'^resource/(?P<key>[0-9]+)/(?P<other>[A-Za-z]+)$', NestedResourceInstance.as_view()),
|
||||
path('', Root.as_view()),
|
||||
path('resource/', ResourceRoot.as_view()),
|
||||
path('resource/customname/', CustomNameResourceInstance.as_view()),
|
||||
re_path(
|
||||
r'^resource/(?P<key>[0-9]+)$',
|
||||
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
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import pytest
|
||||
from django.conf.urls import include, url
|
||||
from django.urls import include, path, re_path
|
||||
from django.test import override_settings
|
||||
|
||||
from rest_framework import serializers, status, versioning
|
||||
|
@ -101,7 +101,8 @@ class TestRequestVersion:
|
|||
scheme = versioning.AcceptHeaderVersioning
|
||||
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)
|
||||
assert response.data == {'version': '1.2.3'}
|
||||
|
||||
|
@ -144,14 +145,20 @@ class TestRequestVersion:
|
|||
|
||||
class TestURLReversing(URLPatternsTestCase, APITestCase):
|
||||
included = [
|
||||
url(r'^namespaced/$', dummy_view, name='another'),
|
||||
url(r'^example/(?P<pk>\d+)/$', dummy_pk_view, name='example-detail')
|
||||
path('namespaced/', dummy_view, name='another'),
|
||||
re_path(
|
||||
r'^example/(?P<pk>\d+)/$',
|
||||
dummy_pk_view,
|
||||
name='example-detail')
|
||||
]
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^v1/', include((included, 'v1'), namespace='v1')),
|
||||
url(r'^another/$', dummy_view, name='another'),
|
||||
url(r'^(?P<version>[v1|v2]+)/another/$', dummy_view, name='another'),
|
||||
path('v1/', include((included, 'v1'), namespace='v1')),
|
||||
path('another/', dummy_view, name='another'),
|
||||
re_path(
|
||||
r'^(?P<version>[v1|v2]+)/another/$',
|
||||
dummy_view,
|
||||
name='another'),
|
||||
]
|
||||
|
||||
def test_reverse_unversioned(self):
|
||||
|
@ -167,7 +174,8 @@ class TestURLReversing(URLPatternsTestCase, APITestCase):
|
|||
|
||||
request = factory.get('/endpoint/?version=v1')
|
||||
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/')
|
||||
response = view(request)
|
||||
|
@ -237,7 +245,8 @@ class TestInvalidVersion:
|
|||
scheme = versioning.AcceptHeaderVersioning
|
||||
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)
|
||||
assert response.status_code == status.HTTP_406_NOT_ACCEPTABLE
|
||||
|
||||
|
@ -300,7 +309,8 @@ class TestAllowedAndDefaultVersion:
|
|||
|
||||
def test_missing_with_default_and_none_allowed(self):
|
||||
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')
|
||||
response = view(request)
|
||||
|
@ -310,12 +320,15 @@ class TestAllowedAndDefaultVersion:
|
|||
|
||||
class TestHyperlinkedRelatedField(URLPatternsTestCase, APITestCase):
|
||||
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 = [
|
||||
url(r'^v1/', include((included, 'v1'), namespace='v1')),
|
||||
url(r'^v2/', include((included, 'v2'), namespace='v2'))
|
||||
path('v1/', include((included, 'v1'), namespace='v1')),
|
||||
path('v2/', include((included, 'v2'), namespace='v2'))
|
||||
]
|
||||
|
||||
def setUp(self):
|
||||
|
@ -342,17 +355,25 @@ class TestHyperlinkedRelatedField(URLPatternsTestCase, APITestCase):
|
|||
|
||||
class TestNamespaceVersioningHyperlinkedRelatedFieldScheme(URLPatternsTestCase, APITestCase):
|
||||
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 = [
|
||||
url(r'^namespaced/(?P<pk>\d+)/$', dummy_pk_view, name='namespaced'),
|
||||
url(r'^nested/', include((nested, 'nested-namespace'), namespace='nested-namespace'))
|
||||
re_path(
|
||||
r'^namespaced/(?P<pk>\d+)/$',
|
||||
dummy_pk_view,
|
||||
name='namespaced'),
|
||||
path(
|
||||
'nested/',
|
||||
include(
|
||||
(nested, 'nested-namespace'),
|
||||
namespace='nested-namespace')
|
||||
)
|
||||
]
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^v1/', include((included, 'restframeworkv1'), namespace='v1')),
|
||||
url(r'^v2/', include((included, 'restframeworkv2'), namespace='v2')),
|
||||
url(r'^non-api/(?P<pk>\d+)/$', dummy_pk_view, name='non-api-view')
|
||||
path('v1/', include((included, 'restframeworkv1'), namespace='v1')),
|
||||
path('v2/', include((included, 'restframeworkv2'), namespace='v2')),
|
||||
re_path(r'^non-api/(?P<pk>\d+)/$', dummy_pk_view, name='non-api-view')
|
||||
]
|
||||
|
||||
def _create_field(self, view_name, version):
|
||||
|
@ -368,22 +389,27 @@ class TestNamespaceVersioningHyperlinkedRelatedFieldScheme(URLPatternsTestCase,
|
|||
|
||||
def test_api_url_is_properly_reversed_with_v1(self):
|
||||
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):
|
||||
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):
|
||||
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):
|
||||
"""
|
||||
Regression test for #2711
|
||||
"""
|
||||
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')
|
||||
assert field.to_representation(PKOnlyObject(10)) == 'http://testserver/non-api/10/'
|
||||
assert field.to_representation(PKOnlyObject(
|
||||
10)) == 'http://testserver/non-api/10/'
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
from collections import OrderedDict
|
||||
|
||||
import pytest
|
||||
from django.conf.urls import include, url
|
||||
from django.urls import include, path, re_path
|
||||
from django.db import models
|
||||
from django.test import TestCase, override_settings
|
||||
|
||||
|
@ -88,7 +88,7 @@ router.register(r'names', ActionNamesViewSet, basename='names')
|
|||
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^api/', include(router.urls)),
|
||||
path('api/', include(router.urls)),
|
||||
]
|
||||
|
||||
|
||||
|
|
|
@ -3,14 +3,14 @@ URLConf for test suite.
|
|||
|
||||
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.documentation import include_docs_urls
|
||||
|
||||
if coreapi:
|
||||
urlpatterns = [
|
||||
url(r'^docs/', include_docs_urls(title='Test Suite API')),
|
||||
path('docs/', include_docs_urls(title='Test Suite API')),
|
||||
]
|
||||
else:
|
||||
urlpatterns = []
|
||||
|
|
Loading…
Reference in New Issue
Block a user