无法从Tableau Server视图下载数据的技术求助
Tableau Server视图数据下载失败问题排查与解决建议
问题背景
尝试从公司Tableau Server发布的视图下载数据,分别使用基于tableauserverclient库的Python代码和Postman工具,均未成功:
- Python代码存在API版本冲突或方法调用逻辑问题
- Postman调用API时,使用Tableau Server生成的令牌名称和密钥,以
Bearer <tokensecret>格式设置Authorization请求头,收到401002未授权错误,XML响应提示认证凭据无效,同时网络提示无法验证首个证书
Python代码示例
import tableauserverclient as TSC import csv # Specify Tableau Server API info server_url = 'https://tableau.na.xom.com' site_id = 'Chemical' mytoken_name = 'test' mytoken_secret = 'U3mHB/1uRMKd+/OSXlgujg==:nR3ZCf4DQwjZe9tQ5qBpXtDoBVDHnZ7y' api_version = '3.1' # Authenticate with Tableau Server tableau_auth = TSC.PersonalAccessTokenAuth(token_name=mytoken_name, personal_access_token=mytoken_secret, site_id=site_id) server = TSC.Server(server_url, use_server_version=True) server.version = api_version with server.auth.sign_in(tableau_auth): all_views, pagination_item = server.views.get() view_name = [view.name for view in all_views] for i in range(len(view_name)): if view_name[i] == 'Dashboard 3': print(view_name[i]) view_ids = [view.id for view in all_views] view_dict = {view_name[i]: view_ids[i] for i in range(len(view_ids))} print(view_dict) # view we want to download data from view_name = 'Dashboard 3' # query view id of vd view_id = view_dict.get(view_name) # set up request to download data in a specific format options = TSC.CSVOptions() # get data from the view and write to a file view_item = server.views.get_by_id(view_id) with open('{}.csv'.format(view_name), 'w', newline='') as csvfile: csvwriter = csv.writer(csvfile) for row in server.views.get_csv(view_item, options): csvwriter.writerow(row) print('Data downloaded successfully!')
Postman请求详情
- 请求地址:
https://tableau.company.com/api/3.19/sites/1edc53ac-e247-4870-9fd3-6fad0ce5f84d/views/2474164d-8d37-4a4c-abc7-c2070fd25fd5/data - 错误响应XML:
<?xml version='1.0' encoding='UTF-8'?> <tsResponse xmlns="http://tableau.com/api" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tableau.com/api https://help.tableau.com/samples/en-us/rest_api/ts-api_3_14.xsd"> <error code="401002"> <summary>Unauthorized Access</summary> <detail>Invalid authentication credentials were provided.</detail> </error> </tsResponse>
解决建议
Python代码问题修复
API版本冲突处理
- 代码中同时设置
use_server_version=True和手动指定server.version = api_version会导致版本冲突,二选一即可:- 若使用服务器兼容的最新版本:删除
server.version = api_version,仅保留server = TSC.Server(server_url, use_server_version=True) - 若必须指定API版本:将
use_server_version设为False,即server = TSC.Server(server_url, use_server_version=False),再设置server.version = api_version
- 若使用服务器兼容的最新版本:删除
- 注意:API版本
3.1较老旧,建议确认公司Tableau Server支持的最低API版本,优先使用更高兼容版本
- 代码中同时设置
视图数据下载逻辑优化
- 无需遍历所有视图构建字典,直接通过名称过滤目标视图:
target_view = next((view for view in all_views if view.name == 'Dashboard 3'), None) if not target_view: print("目标视图不存在") exit() - 下载CSV时,
server.views.get_csv返回完整字符串,直接写入文件更高效:with open(f"{target_view.name}.csv", 'w', newline='', encoding='utf-8') as f: f.write(server.views.get_csv(target_view))
- 无需遍历所有视图构建字典,直接通过名称过滤目标视图:
SSL证书验证问题
- 若公司服务器使用自签名证书,需禁用证书验证(生产环境建议导入根证书):
server.add_http_options({'verify': False})
- 若公司服务器使用自签名证书,需禁用证书验证(生产环境建议导入根证书):
Postman问题修复
认证方式修正
- Tableau Server PAT认证的Authorization头格式应为
Bearer <token_name>:<token_secret>,需将令牌名称和密钥拼接后传入:Authorization: Bearer test:U3mHB/1uRMKd+/OSXlgujg==:nR3ZCf4DQwjZe9tQ5qBpXtDoBVDHnZ7y
- Tableau Server PAT认证的Authorization头格式应为
SSL证书验证处理
- 临时方案:进入Postman设置(
File > Settings > General),禁用SSL certificate verification选项 - 长期方案:导入公司Tableau Server的根证书到Postman信任列表
- 临时方案:进入Postman设置(
API版本匹配
- 确认请求URL中的API版本
3.19与公司Tableau Server版本兼容,若服务器版本较低,需调整为对应支持的API版本
- 确认请求URL中的API版本
内容的提问来源于stack exchange,提问作者karthik nagaraju
相关产品推荐
相关产品推荐

