The ultimate Microsoft Fabric, Power BI, Azure AI, and SQL learning event: Join us in Stockholm, September 24-27, 2024.
Save €200 with code MSCUST on top of early bird pricing!
Find everything you need to get certified on Fabric—skills challenges, live sessions, exam prep, role guidance, and more. Get started
Hi there
I'm trying to embed a power bi panel with python code but I get stuck in the datasetid part
I am using the following code:
def get_embed_params_for_single_report(self, workspace_id, report_id, additional_dataset_id=None):
report_url = f'https://api.powerbi.com/v1.0/myorg/groups/{workspace_id}/dashboards/{report_id}'
api_response = requests.get(report_url, headers=self.get_request_header())
if api_response.status_code != 200:
abort(api_response.status_code, description=f'Error while retrieving Embed URL\n{api_response.reason}:\t{api_response.text}\nRequestId:\t{api_response.headers.get("RequestId")}')
api_response = json.loads(api_response.text)
print(api_response)
report = ReportConfig(api_response['id'], api_response['displayName'], api_response['embedUrl'])
dataset_ids = [api_response['datasetId']]
#dataset_ids = app.config['DATASET_DASHBOARD']
# Append additional dataset to the list to achieve dynamic binding later
if additional_dataset_id is not None:
dataset_ids.append(additional_dataset_id)
embed_token = self.get_embed_token_for_single_report_single_workspace(report_id, dataset_ids, workspace_id)
embed_config = EmbedConfig(embed_token.tokenId, embed_token.token, embed_token.tokenExpiry, [report.__dict__])
return json.dumps(embed_config.__dict__)
If I make a print of api_response = json.loads(api_response.text)
I see that the datasetid does not appear, which for a report does appear with
report_url = f'https://api.powerbi.com/v1.0/myorg/groups/{workspace_id}/reports/{report_id}'
The problem is that the line
embed_token = self.get_embed_token_for_single_report_single_workspace(report_id, dataset_ids, workspace_id)
I get an error because it can't find datasetid
Do you know how to proceed?
HI @apenaranda,
The error message mentions the issue is related to the dataset id. Can you please share some more detail about detail operation steps? They can help us clarify your scenario and test to troubleshoot.
How to Get Your Question Answered Quickly
Regards,
Xiaoxin Sheng
well, I'll explain what I do when I want to embed a report
everything starts in app.py with the def get_embed_info (Returns report embed configuration) which calls
embed_info = PbiEmbedService().get_embed_params_for_single_report(app.config['WORKSPACE_ID'], app.config['REPORT_ID'])
This function will:
class PbiEmbedService:
def get_embed_params_for_single_report(self, workspace_id, report_id, additional_dataset_id=None):
report_url = f'https://api.powerbi.com/v1.0/myorg/groups/{workspace_id}/reports/{report_id}'
api_response = requests.get(report_url, headers=self.get_request_header())
if api_response.status_code != 200:
abort(api_response.status_code, description=f'Error while retrieving Embed URL\n{api_response.reason}:\t{api_response.text}\nRequestId:\t{api_response.headers.get("RequestId")}')
api_response = json.loads(api_response.text)
print(api_response)
report = ReportConfig(api_response['id'], api_response['displayName'], api_response['embedUrl'])
dataset_ids = [api_response['datasetId']]
#dataset_ids = app.config['DATASET_DASHBOARD']
# Append additional dataset to the list to achieve dynamic binding later
if additional_dataset_id is not None:
dataset_ids.append(additional_dataset_id)
embed_token = self.get_embed_token_for_single_report_single_workspace(report_id, dataset_ids, workspace_id)
embed_config = EmbedConfig(embed_token.tokenId, embed_token.token, embed_token.tokenExpiry, [report.__dict__])
return json.dumps(embed_config.__dict__)
get_request_header will generate token:
def get_request_header(self):
return {'Content-Type': 'application/json', 'Authorization': 'Bearer ' + AadService.get_access_token()}
and get_embed_token_for_single_report_single_workspace goes to:
def get_embed_token_for_single_report_single_workspace(self, report_id, dataset_ids, target_workspace_id=None):
'''Get Embed token for single report, multiple datasets, and an optional target workspace
Args:
report_id (str): Report Id
dataset_ids (list): Dataset Ids
target_workspace_id (str, optional): Workspace Id. Defaults to None.
Returns:
EmbedToken: Embed token
'''
request_body = EmbedTokenRequestBody()
for dataset_id in dataset_ids:
request_body.datasets.append({'id': dataset_id})
request_body.reports.append({'id': report_id})
if target_workspace_id is not None:
request_body.targetWorkspaces.append({'id': target_workspace_id})
# Generate Embed token for multiple workspaces, datasets, and reports. Refer https://aka.ms/MultiResourceEmbedToken
embed_token_api = 'https://api.powerbi.com/v1.0/myorg/GenerateToken'
api_response = requests.post(embed_token_api, data=json.dumps(request_body.__dict__), headers=self.get_request_header())
if api_response.status_code != 200:
abort(api_response.status_code, description=f'Error while retrieving Embed token\n{api_response.reason}:\t{api_response.text}\nRequestId:\t{api_response.headers.get("RequestId")}')
api_response = json.loads(api_response.text)
embed_token = EmbedToken(api_response['tokenId'], api_response['token'], api_response['expiration'])
return embed_token
Afterwards, the embedding is generated through index.js:
$(function () {
var reportContainer = $("#report-container").get(0);
// Initialize iframe for embedding report
powerbi.bootstrap(reportContainer, { type: "report" });
var models = window["powerbi-client"].models;
var reportLoadConfig = {
type: "report",
pageView: 'fitToWidth',
tokenType: models.TokenType.Embed,
// Enable this setting to remove gray shoulders from embedded report
// settings: {
// background: models.BackgroundType.Transparent
// }
};
$.ajax({
type: "GET",
url: "/getembedinfo",
dataType: "json",
success: function (data) {
embedData = $.parseJSON(JSON.stringify(data));
console.log(embedData);
reportLoadConfig.accessToken = embedData.accessToken;
// You can embed different reports as per your need
reportLoadConfig.embedUrl = embedData.reportConfig[0].embedUrl;
console.log(reportLoadConfig.embedUrl);
// Use the token expiry to regenerate Embed token for seamless end user experience
// Refer https://aka.ms/RefreshEmbedToken
tokenExpiry = embedData.tokenExpiry;
// Embed Power BI report when Access token and Embed URL are available
var report = powerbi.embed(reportContainer, reportLoadConfig);
// Triggers when a report schema is successfully loaded
report.on("loaded", function () {
console.log("Report load successful")
});
// Triggers when a report is successfully embedded in UI
report.on("rendered", function () {
console.log("Report render successful")
});
// Clear any other error handler event
report.off("error");
// Below patch of code is for handling errors that occur during embedding
report.on("error", function (event) {
var errorMsg = event.detail;
// Use errorMsg variable to log error in any destination of choice
console.error(errorMsg);
return;
});
},
error: function (err) {
// Show error container
var errorContainer = $(".error-container");
$(".embed-container").hide();
errorContainer.show();
// Format error message
var errMessageHtml = "<strong> Error Details: </strong> <br/>" + $.parseJSON(err.responseText)["errorMsg"];
errMessageHtml = errMessageHtml.split("\n").join("<br/>")
// Show error message on UI
errorContainer.html(errMessageHtml);
}
});
});
This process works perfectly embedding reports, the problem comes when embedding the panel. The only thing I substitute (I don't know if it's correct) is the line
report_url = f'https://api.powerbi.com/v1.0/myorg/groups/{workspace_id}/reports/{report_id}'
by
report_url = f'https://api.powerbi.com/v1.0/myorg/groups/{workspace_id}/dashboards/{report_id}'
and also in index.js that changed report for dashboard
If I run I get the error:
Error Details:
'datasetId'
This would be the entire process.
Join the community in Stockholm for expert Microsoft Fabric learning including a very exciting keynote from Arun Ulag, Corporate Vice President, Azure Data.
Check out the August 2024 Power BI update to learn about new features.
Learn from experts, get hands-on experience, and win awesome prizes.
User | Count |
---|---|
19 | |
2 | |
2 | |
1 | |
1 |
User | Count |
---|---|
42 | |
3 | |
2 | |
2 | |
2 |