| @@ -564,3 +564,7 @@ QUEUE_MONITOR_THRESHOLD=200 | |||
| QUEUE_MONITOR_ALERT_EMAILS= | |||
| # Monitor interval in minutes, default is 30 minutes | |||
| QUEUE_MONITOR_INTERVAL=30 | |||
| # Swagger UI configuration | |||
| SWAGGER_UI_ENABLED=true | |||
| SWAGGER_UI_PATH=/swagger-ui.html | |||
| @@ -1,4 +1,4 @@ | |||
| from typing import Annotated, Literal, Optional | |||
| from typing import Literal, Optional | |||
| from pydantic import ( | |||
| AliasChoices, | |||
| @@ -976,6 +976,18 @@ class WorkflowLogConfig(BaseSettings): | |||
| ) | |||
| class SwaggerUIConfig(BaseSettings): | |||
| SWAGGER_UI_ENABLED: bool = Field( | |||
| description="Whether to enable Swagger UI in api module", | |||
| default=True, | |||
| ) | |||
| SWAGGER_UI_PATH: str = Field( | |||
| description="Swagger UI page path in api module", | |||
| default="/swagger-ui.html", | |||
| ) | |||
| class FeatureConfig( | |||
| # place the configs in alphabet order | |||
| AppExecutionConfig, | |||
| @@ -1007,6 +1019,7 @@ class FeatureConfig( | |||
| WorkspaceConfig, | |||
| LoginConfig, | |||
| AccountConfig, | |||
| SwaggerUIConfig, | |||
| # hosted services config | |||
| HostedServiceConfig, | |||
| CeleryBeatConfig, | |||
| @@ -21,7 +21,7 @@ login_manager = flask_login.LoginManager() | |||
| def load_user_from_request(request_from_flask_login): | |||
| """Load user based on the request.""" | |||
| # Skip authentication for documentation endpoints | |||
| if request.path.endswith("/docs") or request.path.endswith("/swagger.json"): | |||
| if dify_config.SWAGGER_UI_ENABLED and request.path.endswith((dify_config.SWAGGER_UI_PATH, "/swagger.json")): | |||
| return None | |||
| auth_header = request.headers.get("Authorization", "") | |||
| @@ -3,11 +3,12 @@ import sys | |||
| from collections.abc import Mapping | |||
| from typing import Any | |||
| from flask import current_app, got_request_exception | |||
| from flask import Blueprint, Flask, current_app, got_request_exception | |||
| from flask_restx import Api | |||
| from werkzeug.exceptions import HTTPException | |||
| from werkzeug.http import HTTP_STATUS_CODES | |||
| from configs import dify_config | |||
| from core.errors.error import AppInvokeQuotaExceededError | |||
| @@ -115,8 +116,13 @@ class ExternalApi(Api): | |||
| } | |||
| } | |||
| def __init__(self, *args, **kwargs): | |||
| def __init__(self, app: Blueprint | Flask, *args, **kwargs): | |||
| kwargs.setdefault("authorizations", self._authorizations) | |||
| kwargs.setdefault("security", "Bearer") | |||
| super().__init__(*args, **kwargs) | |||
| kwargs["add_specs"] = dify_config.SWAGGER_UI_ENABLED | |||
| kwargs["doc"] = dify_config.SWAGGER_UI_PATH if dify_config.SWAGGER_UI_ENABLED else False | |||
| # manual separate call on construction and init_app to ensure configs in kwargs effective | |||
| super().__init__(app=None, *args, **kwargs) # type: ignore | |||
| self.init_app(app, **kwargs) | |||
| register_external_error_handlers(self) | |||
| @@ -1250,6 +1250,10 @@ QUEUE_MONITOR_ALERT_EMAILS= | |||
| # Monitor interval in minutes, default is 30 minutes | |||
| QUEUE_MONITOR_INTERVAL=30 | |||
| # Swagger UI configuration | |||
| SWAGGER_UI_ENABLED=true | |||
| SWAGGER_UI_PATH=/swagger-ui.html | |||
| # Celery schedule tasks configuration | |||
| ENABLE_CLEAN_EMBEDDING_CACHE_TASK=false | |||
| ENABLE_CLEAN_UNUSED_DATASETS_TASK=false | |||
| @@ -566,6 +566,8 @@ x-shared-env: &shared-api-worker-env | |||
| QUEUE_MONITOR_THRESHOLD: ${QUEUE_MONITOR_THRESHOLD:-200} | |||
| QUEUE_MONITOR_ALERT_EMAILS: ${QUEUE_MONITOR_ALERT_EMAILS:-} | |||
| QUEUE_MONITOR_INTERVAL: ${QUEUE_MONITOR_INTERVAL:-30} | |||
| SWAGGER_UI_ENABLED: ${SWAGGER_UI_ENABLED:-true} | |||
| SWAGGER_UI_PATH: ${SWAGGER_UI_PATH:-/swagger-ui.html} | |||
| ENABLE_CLEAN_EMBEDDING_CACHE_TASK: ${ENABLE_CLEAN_EMBEDDING_CACHE_TASK:-false} | |||
| ENABLE_CLEAN_UNUSED_DATASETS_TASK: ${ENABLE_CLEAN_UNUSED_DATASETS_TASK:-false} | |||
| ENABLE_CREATE_TIDB_SERVERLESS_TASK: ${ENABLE_CREATE_TIDB_SERVERLESS_TASK:-false} | |||