From 30adda756e5f863be3a54221b30599469fd95fb0 Mon Sep 17 00:00:00 2001 From: "T. Franzel" Date: Sun, 19 Dec 2021 16:46:58 +0100 Subject: [PATCH] ease schema browser handling with "Content-Disposition" #607 thanks to @bahag-raesenerm for the proposition --- drf_spectacular/views.py | 12 +++++++++++- tests/test_view.py | 4 ++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/drf_spectacular/views.py b/drf_spectacular/views.py index a04a8c62..257e1ecc 100644 --- a/drf_spectacular/views.py +++ b/drf_spectacular/views.py @@ -73,7 +73,17 @@ def _get_schema_response(self, request): # that we try to source version through the schema view's own versioning_class. version = self.api_version or request.version or self._get_version_parameter(request) generator = self.generator_class(urlconf=self.urlconf, api_version=version) - return Response(generator.get_schema(request=request, public=self.serve_public)) + return Response( + data=generator.get_schema(request=request, public=self.serve_public), + headers={"Content-Disposition": f'inline; filename="{self._get_filename(request, version)}"'} + ) + + def _get_filename(self, request, version): + return "{title}{version}.{suffix}".format( + title=spectacular_settings.TITLE or 'schema', + version=f'({version})' if version else '', + suffix=self.perform_content_negotiation(request, force=True)[0].format + ) def _get_version_parameter(self, request): version = request.GET.get('version') diff --git a/tests/test_view.py b/tests/test_view.py index f63350ee..9c125982 100644 --- a/tests/test_view.py +++ b/tests/test_view.py @@ -2,6 +2,7 @@ import pytest import yaml +from django import __version__ as DJANGO_VERSION from django.urls import path from rest_framework.decorators import api_view from rest_framework.response import Response @@ -47,6 +48,9 @@ def test_spectacular_view(no_warnings): assert response.content.startswith(b'openapi: 3.0.3\n') assert response.accepted_media_type == 'application/vnd.oai.openapi' + if DJANGO_VERSION > '3': + assert response.headers.get('CONTENT-DISPOSITION') == 'inline; filename="schema.yaml"' + schema = yaml.load(response.content, Loader=yaml.SafeLoader) validate_schema(schema) assert len(schema['paths']) == 2