diff --git a/openapi_core/contrib/django/requests.py b/openapi_core/contrib/django/requests.py index 9058be51..4a41bafd 100644 --- a/openapi_core/contrib/django/requests.py +++ b/openapi_core/contrib/django/requests.py @@ -36,6 +36,11 @@ def create(cls, request): else: route = cls.path_regex.sub( r'{\1}', request.resolver_match.route) + # Delete start and end marker to allow concatenation. + if route[:1] == "^": + route = route[1:] + if route[-1:] == "$": + route = route[:-1] path_pattern = '/' + route path = request.resolver_match and request.resolver_match.kwargs or {} diff --git a/tests/integration/contrib/test_django.py b/tests/integration/contrib/test_django.py index e23bfc19..61d8f676 100644 --- a/tests/integration/contrib/test_django.py +++ b/tests/integration/contrib/test_django.py @@ -19,7 +19,7 @@ def django_settings(self): import django from django.conf import settings from django.contrib import admin - from django.urls import path + from django.urls import path, re_path if settings.configured: return @@ -44,6 +44,7 @@ def django_settings(self): django.setup() settings.ROOT_URLCONF = ( path('admin/', admin.site.urls), + re_path('^test/test-regexp/$', lambda d: None) ) @pytest.fixture @@ -138,6 +139,31 @@ def test_url_rule(self, request_factory): assert openapi_request.body == request.body assert openapi_request.mimetype == request.content_type + def test_url_regexp_pattern(self, request_factory): + from django.urls import resolve + request = request_factory.get('/test/test-regexp/') + request.resolver_match = resolve('/test/test-regexp/') + + openapi_request = DjangoOpenAPIRequest(request) + + path = {} + query = {} + headers = { + 'Cookie': '', + } + cookies = {} + assert openapi_request.parameters == RequestParameters( + path=path, + query=query, + header=headers, + cookie=cookies, + ) + assert openapi_request.method == request.method.lower() + assert openapi_request.full_url_pattern == \ + request._current_scheme_host + "/test/test-regexp/" + assert openapi_request.body == request.body + assert openapi_request.mimetype == request.content_type + class TestDjangoOpenAPIResponse(BaseTestDjango):