我正在尝试通过 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 的预览响应中,我得到了以下输出:

有人可以帮助解决这个问题吗?
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)
我注意到,由于某种原因,当我在生产环境中运行 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)
| 归档时间: |
|
| 查看次数: |
5337 次 |
| 最近记录: |