无需登录分享Kibana Dashboard到站点的Python实现方案咨询
基于Python实现Kibana仪表盘免登录嵌入的可行方案
核心实现逻辑
- 无需修改Kibana/Elasticsearch服务端配置,通过Python实现一层轻量代理,自动在请求中注入Kibana认证凭证,前端直接调用代理地址即可免登录访问仪表盘
- 方案仅需要基础Python运行环境,操作门槛极低,适合ELK栈入门用户使用
操作步骤
1. 生成Kibana访问凭证
登录Kibana后台,点击右上角个人头像 > 管理API密钥 > 创建API密钥,自定义名称后可设置永久有效期,生成后复制完整API密钥字符串保存,该密钥仅显示一次。
2. 安装Python依赖
执行命令安装需要的第三方库:pip install fastapi uvicorn httpx
3. 编写代理服务代码
新建main.py文件,填入以下代码,按注释替换成你自己的配置信息:
from fastapi import FastAPI, Request, Response from fastapi.middleware.cors import CORSMiddleware import httpx app = FastAPI() # 生产环境请替换为你自有网站的实际域名,不要使用* app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 配置项替换为你的实际信息 KIBANA_HOST = "http://你的Kibana服务地址:5601" # 认证头格式固定为ApiKey+空格+你刚才复制的API密钥 KIBANA_AUTH_HEADER = "ApiKey 替换为你生成的Kibana API密钥" # 捕获所有路径请求做转发 @app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE", "OPTIONS"]) async def proxy(path: str, request: Request, response: Response): kibana_url = f"{KIBANA_HOST}/{path}" headers = dict(request.headers) # 注入认证信息 headers["Authorization"] = KIBANA_AUTH_HEADER headers.pop("host", None) async with httpx.AsyncClient() as client: resp = await client.request( method=request.method, url=kibana_url, headers=headers, content=await request.body(), params=request.query_params ) # 透传Kibana返回的响应头和状态码 for key, value in resp.headers.items(): if key.lower() not in ["content-length", "transfer-encoding", "connection"]: response.headers[key] = value response.status_code = resp.status_code return resp.content
4. 启动代理服务
执行命令启动服务:uvicorn main:app --host 0.0.0.0 --port 8000
5. 网站嵌入仪表盘
将原有Kibana仪表盘地址的服务地址部分替换为你的Python代理服务地址,直接放入iframe即可:
<iframe src="http://你的Python代理服务地址:8000/app/dashboards#/view/你的仪表盘ID" width="100%" height="800" frameborder="0"></iframe>
注意事项
- 生产环境务必将跨域配置中的
allow_origins改为自有网站的实际域名,避免未授权访问 - 生成API密钥时请配置最小权限,仅开放仪表盘只读权限,禁止分配数据修改权限
- 访问量较大时可将服务通过gunicorn部署,或挂载到Nginx后提升性能
内容的提问来源于stack exchange,提问作者Yubraj
相关产品推荐
相关产品推荐

