导入仪表板时出现问题:响应显示登录页面
Problem importing a dashboard: The response shows a login page
当我使用 Superset 的 API 导入仪表板时,响应显示登录页面。
我正在使用 Python 执行请求。
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 = requests.get(url, files=files, headers=headers)
有谁知道如何解决这个问题?
我自己在使用 Superset API 时遇到了一些问题,主要是因为我没有正确处理 CSRF 令牌:
JWT 令牌的检索、CSRF 令牌和实际请求发生在同一会话中似乎很重要。
如果我不那样做,我可以重现你的错误并且也被发送到登录页面(你在这个例子中也使用了 GET 请求,但它应该是 POST)。
这是我本地测试设置的示例:
import requests
session = requests.session()
jwt_token = session.post(
url='http://localhost:8088/api/v1/security/login',
json={
"username": "admin",
"password": "admin",
"refresh": False,
"provider": "db"
}
).json()["access_token"]
csrf_token = session.get(
url='http://localhost:8088/api/v1/security/csrf_token/',
headers={
'Authorization': f'Bearer {jwt_token}',
}
).json()["result"]
headers = {
'accept': 'application/json',
'Authorization': f'Bearer {jwt_token}',
'X-CSRFToken': csrf_token,
}
response = requests.post(
'http://localhost:8088/api/v1/dashboard/import',
headers=headers,
files={
"formData": ('dashboards.json', open("dashboards.json", "rb"), 'application/json')
},
)
session.close()
当我使用 Superset 的 API 导入仪表板时,响应显示登录页面。
我正在使用 Python 执行请求。
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 = requests.get(url, files=files, headers=headers)
有谁知道如何解决这个问题?
我自己在使用 Superset API 时遇到了一些问题,主要是因为我没有正确处理 CSRF 令牌:
JWT 令牌的检索、CSRF 令牌和实际请求发生在同一会话中似乎很重要。
如果我不那样做,我可以重现你的错误并且也被发送到登录页面(你在这个例子中也使用了 GET 请求,但它应该是 POST)。
这是我本地测试设置的示例:
import requests
session = requests.session()
jwt_token = session.post(
url='http://localhost:8088/api/v1/security/login',
json={
"username": "admin",
"password": "admin",
"refresh": False,
"provider": "db"
}
).json()["access_token"]
csrf_token = session.get(
url='http://localhost:8088/api/v1/security/csrf_token/',
headers={
'Authorization': f'Bearer {jwt_token}',
}
).json()["result"]
headers = {
'accept': 'application/json',
'Authorization': f'Bearer {jwt_token}',
'X-CSRFToken': csrf_token,
}
response = requests.post(
'http://localhost:8088/api/v1/dashboard/import',
headers=headers,
files={
"formData": ('dashboards.json', open("dashboards.json", "rb"), 'application/json')
},
)
session.close()