通过 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)