提问人:imeda 提问时间:11/17/2023 最后编辑:Olaf Kockimeda 更新时间:11/17/2023 访问量:25
无法在 Apache Superset 中对 WSGI Web 应用程序进行 iframe
Unable to iframe WSGI Web App in Apache Superset
问:
前同事开发了一个内部图形工具,用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 文件:这在我的计算机上完美运行
答: 暂无答案
评论