通过 api 在超集中导入仪表板
Import dashboard in superset through api
我正在尝试通过 API 导入 Superset 仪表板,但目前尚未成功。
我正在关注 Superset API 文档以使用端点
导入
/api/v1/dashboard/import
我的导入负载如下:
POST /api/v1/dashboard/import/ HTTP/1.1
Host: localhost:8088
Authorization: Bearer <access token>
Content-Length: 289
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="formData"; filename="20210615_065115.json"
Content-Type: application/json
(data)
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="overwrite"
True
----WebKitFormBoundary7MA4YWxkTrZu0gW
我收到状态为 200 的响应,但仪表板未导入,在邮递员的预览响应中得到如下图所示的输出:
有人可以帮助解决这个问题吗?
谢谢。
Superset 文档对此不是很清楚,但我终于设法解决了这个问题。
如您所见,您的响应将您重定向到登录页面。
您需要做的是先向 /api/v1/security/csrf_token/
发出 GET
请求
并在 /api/v1/dashboard/import
的请求中添加 header
'X-CSRFToken': csrf_token
文档中的另一件事是 Content-type
不是 multipart/form-data;
,而是 text/html; charset=utf-8
所以基本上在你的电话中你不需要在 headers
中传递 Content-type
Python 示例:
import requests
headers = {
'accept': 'application/json',
'Authorization': f'Bearer {jwt_token}',
'X-CSRFToken': csrf_token
}
files = {
'formData': (
dashboard_path,
open(dashboard_path, 'rb'),
'application/json'
)
}
response = self.session.get(url, files=files, headers=headers)
编辑 2021 年 8 月 30 日
我注意到,出于某种原因,当我在生产环境中使用 运行 超集 AUTH_TYPE = AUTH_OAUTH
时,上面的解决方案停止工作了。
它还需要 header Referer
包含在 header 中,所以更安全的选择是
import requests
headers = {
'accept': 'application/json',
'Authorization': f'Bearer {jwt_token}',
'X-CSRFToken': csrf_token,
'Referer': url
}
files = {
'formData': (
dashboard_path,
open(dashboard_path, 'rb'),
'application/json'
)
}
response = self.session.get(url, files=files, headers=headers)
我正在尝试通过 API 导入 Superset 仪表板,但目前尚未成功。 我正在关注 Superset API 文档以使用端点
导入/api/v1/dashboard/import
我的导入负载如下:
POST /api/v1/dashboard/import/ HTTP/1.1
Host: localhost:8088
Authorization: Bearer <access token>
Content-Length: 289
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="formData"; filename="20210615_065115.json"
Content-Type: application/json
(data)
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="overwrite"
True
----WebKitFormBoundary7MA4YWxkTrZu0gW
我收到状态为 200 的响应,但仪表板未导入,在邮递员的预览响应中得到如下图所示的输出:
有人可以帮助解决这个问题吗?
谢谢。
Superset 文档对此不是很清楚,但我终于设法解决了这个问题。
如您所见,您的响应将您重定向到登录页面。
您需要做的是先向 /api/v1/security/csrf_token/
GET
请求
并在 /api/v1/dashboard/import
'X-CSRFToken': csrf_token
文档中的另一件事是 Content-type
不是 multipart/form-data;
,而是 text/html; charset=utf-8
所以基本上在你的电话中你不需要在 headers
中传递Content-type
Python 示例:
import requests
headers = {
'accept': 'application/json',
'Authorization': f'Bearer {jwt_token}',
'X-CSRFToken': csrf_token
}
files = {
'formData': (
dashboard_path,
open(dashboard_path, 'rb'),
'application/json'
)
}
response = self.session.get(url, files=files, headers=headers)
编辑 2021 年 8 月 30 日
我注意到,出于某种原因,当我在生产环境中使用 运行 超集 AUTH_TYPE = AUTH_OAUTH
时,上面的解决方案停止工作了。
它还需要 header Referer
包含在 header 中,所以更安全的选择是
import requests
headers = {
'accept': 'application/json',
'Authorization': f'Bearer {jwt_token}',
'X-CSRFToken': csrf_token,
'Referer': url
}
files = {
'formData': (
dashboard_path,
open(dashboard_path, 'rb'),
'application/json'
)
}
response = self.session.get(url, files=files, headers=headers)