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):
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: