无法在 Apache Superset 中对 WSGI Web 应用程序进行 iframe

Unable to iframe WSGI Web App in Apache Superset

提问人:imeda 提问时间:11/17/2023 最后编辑:Olaf Kockimeda 更新时间:11/17/2023 访问量:25

问:

前同事开发了一个内部图形工具,用Apache Superset和基于Dash的WSGI应用程序来查看数据。当然,这些前同事已经不在这里了。 所以基本上,他们基于 Dash 开发了这个工具,因为 Superset 不符合他们的想法。

当我们尝试将 Dash 应用程序嵌入 HTML iframe 中时,我们在 Superset 上实际上遇到了问题。Superset 上没有任何显示内容。但是,当我创建调用网页的简单 HTML 文件时,iframe 实际上有效。

Apache Superset 和 Dash 应用程序都支持 NGINX 进行 HTTPS 重定向。 以下是所有必需的配置/代码,因此您可以帮助我解决这种情况。

Apache 超集

superset_config.py(不含密钥、SQL URI 和服务器信息):

DISPLAY_MAX_ROW = 1000
ROW_LIMIT = 1000000
SQL_MAX_ROW = 1000000

# Flask-WTF flag for CSRF
WTF_CSRF_ENABLED = False
# Add endpoints that need to be exempt from CSRF protection
WTF_CSRF_EXEMPT_LIST = []
# A CSRF token that expires in 1 year
WTF_CSRF_TIME_LIMIT = 60 * 60 * 24 * 365

# Set this API key to enable Mapbox visualizations
MAPBOX_API_KEY = ''

FEATURE_FLAGS = {
    "ALERT_REPORTS": True,
    "DASHBOARD_CROSS_FILTERS": True,
    "DASHBOARD_FILTERS_EXPERIMENTAL": True,
    "DASHBOARD_NATIVE_FILTERS_SET": True,
    "DASHBOARD_NATIVE_FILTERS": True,
    "DASHBOARD_RBAC": True,
    "DYNAMIC_PLUGINS": True,
    "ENABLE_TEMPLATE_PROCESSING": True
}

ENABLE_CORS = True
CORS_OPTIONS = {
    'allow_headers': ['*'],
    'origins': ['*'],
    'resources': ['*']
}

EXPLORE_FORM_DATA_CACHE_CONFIG = {
    'CACHE_TYPE': 'RedisCache',
    'CACHE_DEFAULT_TIMEOUT': 86400,
    'CACHE_KEY_PREFIX': 'EXPLORE_FORM_DATA_CACHE_CONFIG',
    'CACHE_REDIS_URL': 'redis://localhost:6379/0'
}

FILTER_STATE_CACHE_CONFIG = {
    'CACHE_TYPE': 'RedisCache',
    'CACHE_DEFAULT_TIMEOUT': 86400,
    'CACHE_KEY_PREFIX': 'FILTER_STATE_CACHE_CONFIG',
    'CACHE_REDIS_URL': 'redis://localhost:6379/0'
}

TALISMAN_ENABLED = True
TALISMAN_CONFIG = {
    "content_security_policy": {
        "img-src": [
            "'self'",
            "data:"
        ],
        "connect-src": [
            "'self'",
            "https://api.mapbox.com",
            "https://events.mapbox.com",
        ],
        "style-src": [
            "'self'",
            "'unsafe-inline'"
        ],
        "frame-ancestors": [
            "'self'"
        ]
    },
    "content_security_policy_nonce_in": [
        "script-src"
    ],
    "force_https": True
}

NGINX for Superset(隐藏证书信息和服务器信息):

server {
        listen 443 ssl;
        listen [::]:443 ssl;

        location / {
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;

                proxy_redirect off;
        }
}

达世币WSGI

from dash import Dash, dcc, html, Input, Output, callback
import apps
import os
import pkgutil
import re

superset_colors = {"blue" : "rgb(32,167,201)"}

app = Dash(__name__, suppress_callback_exceptions=True, title = "IMEDA")

server = app.server

app.layout = html.Div([
    dcc.Location(id='url', refresh=False),
    html.Div(id='page-content')
])

@callback(Output('page-content', 'children'), Input('url', 'pathname'))

def display_page(pathname):
    address = re.search(r"/apps/(.*)", pathname)
    modules = [a.name  for a in pkgutil.iter_modules(apps.__path__)]

    if address is not None:
        dashboard = address.group(1)

    if address is None or dashboard not in modules:
        return '404'
    else:
        return getattr(apps, dashboard).layout

if __name__ == '__main__':
    app.run(debug=True)

用于 Dash WSGI 的 NGINX :

server {
        listen 8443 ssl;
        listen [::]:8443 ssl;

        location / {
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;

                proxy_redirect off;
        }
}

我希望你们能帮助我找到解决这个问题的方法。

我尝试了以下步骤

  • 我尝试在 superset_config.py 和 app.py 中使用 CSP 设置
  • 我尝试在 NGINX 中为 Superset 和 Dash 使用 HTTP 标头
  • 我创建了名为 iframe 的 HTML 文件:这在我的计算机上完美运行
python plotly-dash apache-superset

评论


答: 暂无答案