diff --git a/docs/settings.rst b/docs/settings.rst
index 47338d9..15ef61d 100644
--- a/docs/settings.rst
+++ b/docs/settings.rst
@@ -248,6 +248,14 @@ Re-fetch the OpenAPI document without credentials after authorization is removed
**Default**: :python:`'False` |br|
*Maps to parameter*: -
+FETCH_SCHEMA_WITH_QUERY
+-----------------------
+
+Fetch the OpenAPI document using the query parameters passed to the swagger-ui page request.
+
+**Default**: :python:`'True` |br|
+*Maps to parameter*: -
+
OPERATIONS_SORTER
-----------------
@@ -441,5 +449,13 @@ Show required properties first ordered in the same order as in required array.
**Default**: :python:`False` |br|
*Maps to attribute*: ``requiredPropsFirst``
+FETCH_SCHEMA_WITH_QUERY
+-----------------------
+
+Fetch the OpenAPI document using the query parameters passed to the ReDoc page request.
+
+**Default**: :python:`'True` |br|
+*Maps to parameter*: -
+
.. _FORCE_SCRIPT_NAME: https://docs.djangoproject.com/en/2.0/ref/settings/#force-script-name
diff --git a/src/drf_yasg/app_settings.py b/src/drf_yasg/app_settings.py
index ac806fe..6f6e536 100644
--- a/src/drf_yasg/app_settings.py
+++ b/src/drf_yasg/app_settings.py
@@ -45,6 +45,7 @@ SWAGGER_DEFAULTS = {
'PERSIST_AUTH': False,
'REFETCH_SCHEMA_WITH_AUTH': False,
'REFETCH_SCHEMA_ON_LOGOUT': False,
+ 'FETCH_SCHEMA_WITH_QUERY': True,
'OPERATIONS_SORTER': None,
'TAGS_SORTER': None,
@@ -77,6 +78,7 @@ REDOC_DEFAULTS = {
'PATH_IN_MIDDLE': False,
'NATIVE_SCROLLBARS': False,
'REQUIRED_PROPS_FIRST': False,
+ 'FETCH_SCHEMA_WITH_QUERY': True,
}
IMPORT_STRINGS = [
diff --git a/src/drf_yasg/renderers.py b/src/drf_yasg/renderers.py
index 142a56a..790c5fc 100644
--- a/src/drf_yasg/renderers.py
+++ b/src/drf_yasg/renderers.py
@@ -137,6 +137,7 @@ class SwaggerUIRenderer(_UIRenderer):
'persistAuth': swagger_settings.PERSIST_AUTH,
'refetchWithAuth': swagger_settings.REFETCH_SCHEMA_WITH_AUTH,
'refetchOnLogout': swagger_settings.REFETCH_SCHEMA_ON_LOGOUT,
+ 'fetchSchemaWithQuery': swagger_settings.FETCH_SCHEMA_WITH_QUERY,
}
data = filter_none(data)
@@ -164,6 +165,7 @@ class ReDocRenderer(_UIRenderer):
'pathInMiddlePanel': redoc_settings.PATH_IN_MIDDLE,
'nativeScrollbars': redoc_settings.NATIVE_SCROLLBARS,
'requiredPropsFirst': redoc_settings.REQUIRED_PROPS_FIRST,
+ 'fetchSchemaWithQuery': redoc_settings.FETCH_SCHEMA_WITH_QUERY,
}
return filter_none(data)
diff --git a/src/drf_yasg/static/drf-yasg/redoc-init.js b/src/drf_yasg/static/drf-yasg/redoc-init.js
index a8b59e3..95e5112 100644
--- a/src/drf_yasg/static/drf-yasg/redoc-init.js
+++ b/src/drf_yasg/static/drf-yasg/redoc-init.js
@@ -7,8 +7,20 @@ var redoc = document.createElement("redoc");
var redocSettings = JSON.parse(document.getElementById('redoc-settings').innerHTML);
if (redocSettings.url) {
specURL = redocSettings.url;
- delete redocSettings.url;
}
+delete redocSettings.url;
+if (redocSettings.fetchSchemaWithQuery) {
+ var query = new URLSearchParams(window.location.search).entries();
+ var url = specURL.split('?');
+ var usp = new URLSearchParams(url[1]);
+ for (var it = query.next(); !it.done; it = query.next()) {
+ usp.set(it.value[0], it.value[1]);
+ }
+ url[1] = usp.toString();
+ specURL = url[1] ? url.join('?') : url[0];
+}
+delete redocSettings.fetchSchemaWithQuery;
+
redoc.setAttribute("spec-url", specURL);
function camelToKebab(str) {
@@ -36,8 +48,8 @@ function hideEmptyVersion() {
var versionString = apiVersion.innerText;
if (versionString) {
// trim spaces and surrounding ()
- versionString = versionString.replace(/ /g,'');
- versionString = versionString.replace(/(^\()|(\)$)/g,'');
+ versionString = versionString.replace(/ /g, '');
+ versionString = versionString.replace(/(^\()|(\)$)/g, '');
}
if (!versionString) {
diff --git a/src/drf_yasg/static/drf-yasg/swagger-ui-init.js b/src/drf_yasg/static/drf-yasg/swagger-ui-init.js
index fc1941f..e5af94c 100644
--- a/src/drf_yasg/static/drf-yasg/swagger-ui-init.js
+++ b/src/drf_yasg/static/drf-yasg/swagger-ui-init.js
@@ -91,9 +91,11 @@ function initSwaggerUiConfig(swaggerSettings, oauth2Settings) {
var persistAuth = swaggerSettings.persistAuth;
var refetchWithAuth = swaggerSettings.refetchWithAuth;
var refetchOnLogout = swaggerSettings.refetchOnLogout;
+ var fetchSchemaWithQuery = swaggerSettings.fetchSchemaWithQuery;
delete swaggerSettings['persistAuth'];
delete swaggerSettings['refetchWithAuth'];
delete swaggerSettings['refetchOnLogout'];
+ delete swaggerSettings['fetchSchemaWithQuery'];
for (var p in swaggerSettings) {
if (swaggerSettings.hasOwnProperty(p)) {
@@ -101,6 +103,15 @@ function initSwaggerUiConfig(swaggerSettings, oauth2Settings) {
}
}
+ if (fetchSchemaWithQuery) {
+ // only add query params from document for the first spec request
+ // this ensures we otherwise honor the spec selector box which might be manually modified
+ var query = new URLSearchParams(window.location.search).entries();
+ for (var it = query.next(); !it.done; it = query.next()) {
+ swaggerUiConfig.url = setQueryParam(swaggerUiConfig.url, it.value[0], it.value[1]);
+ }
+ }
+
if (persistAuth || refetchWithAuth) {
var hookedAuth = false;
if (persistAuth) {
@@ -132,7 +143,6 @@ function initSwaggerUiConfig(swaggerSettings, oauth2Settings) {
var headers = request.headers || {};
if (request.loadSpec) {
var newUrl = request.url;
-
if (refetchWithAuth) {
newUrl = applyAuth(savedAuth, newUrl, headers) || newUrl;
}
diff --git a/src/drf_yasg/templates/drf-yasg/redoc.html b/src/drf_yasg/templates/drf-yasg/redoc.html
index f51a5eb..9c8fc68 100644
--- a/src/drf_yasg/templates/drf-yasg/redoc.html
+++ b/src/drf_yasg/templates/drf-yasg/redoc.html
@@ -38,6 +38,7 @@
{% block main_scripts %}
+
{% endblock %}