通过 REST API 在 Apache Superset 中导入仪表板

Kel*_*yen 6 apache-superset

我正在尝试通过 API 导入 Superset 仪表板,但目前尚未成功。我正在按照 Superset API 文档使用端点导入:

/api/v1/dashboard/import
Run Code Online (Sandbox Code Playgroud)

我的导入有效负载如下:

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
Run Code Online (Sandbox Code Playgroud)

我收到了状态响应200,但仪表板未导入,在 Postman 的预览响应中,我得到了以下输出: 在此输入图像描述

有人可以帮助解决这个问题吗?

puc*_*hal 6

Superset 文档对此不是很清楚,但我终于设法解决了这个问题。

如您所见,您的响应将您重定向到登录页面。您需要做的是首先GET向/api/v1/security/csrf_token/

并在您的请求中添加标头/api/v1/dashboard/import

'X-CSRFToken': csrf_token

文档中另一个不正确的事情是Content-type不是,multipart/form-data;但它是text/html; charset=utf-8

所以基本上在你的通话中你不需要传入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.post(url, files=files, headers=headers)
Run Code Online (Sandbox Code Playgroud)

编辑 2021 年 8 月 30 日

我注意到,由于某种原因,当我在生产环境中运行 Superset 时,AUTH_TYPE = AUTH_OAUTH上述解决方案停止工作。

它需要额外的标头Referer包含在标头中,所以更安全的选择是


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.post(url, files=files, headers=headers)
Run Code Online (Sandbox Code Playgroud)