我有一个超小(一个视图)的django应用程序,该应用程序从tableau服务器加载视图。
我已经可以使用trust app method的连接了,如果我将URL放到浏览器中,就可以正常加载了。
但是,当我尝试在django模板中呈现同一页面时-django尝试加载所有资源,就像它们在本地存在一样(不起作用)。
视图如下:
def index(request):
url = os.environ.get("tableau_HOST")
username = request.user.username
ticket = get_tableau_ticket(url, username)
if ticket:
data = requests.get(url+ticket+'/views/SIPPlan/DashboardView', data={'username': username})
print(data.text)
else:
# Handle the error - not implemented yet
r = ticket
return render(
request,
"tableau/index.html",
{
"tableau_data": data.text,
},
)
在我的模板中,它看起来像这样:
{% extends "myapp/base_template.html" %}
{% load static %}
{% block content %}
{% autoescape off %}
{{ tableau_data }}
{% endautoescape %}
{% endblock %}
当我加载视图时-我看到它试图从我的本地计算机上加载资源(不应该,它存在于tableau服务器中)。
[09/Aug/2019 08:26:28] "GET /vizql/v_201921906211547/javascripts/formatters-and-parsers.en_US.js HTTP/1.1" 404 3610
Not Found: /vizql/v_201921906211547/javascripts/vqlweb.js
2019-08-09 08:26:28,639 - django.request WARNING Not Found: /vizql/v_201921906211547/javascripts/vqlweb.js
[09/Aug/2019 08:26:28] "GET /vizql/v_201921906211547/javascripts/vqlweb.js HTTP/1.1" 404 3544
Not Found: /vizql/v_201921906211547/javascripts/require.min.js
2019-08-09 08:26:28,700 - django.request WARNING Not Found: /vizql/v_201921906211547/javascripts/require.min.js
...etc...
但是,再次-如果我只是点击在浏览器中构建的URL(而不是嵌入模板中),它就会很好显示。
所以我想我的问题是:有没有一种好的方法可以在django模板页面内呈现另一个HTML页面?我似乎不知道该怎么办。
答案 0 :(得分:1)
要嵌入Tableau,您应该使用其embed code (script tag) 或使用Tableau JS API。在幕后,这两种路线最终都会创建一个包含视图URL的iframe。
您正在做的是从Tableau中获取HTML,并将其插入服务器端的网页中,然后由Django服务器提供该HTML。当该HTML引用的资产尝试加载时,它将查看您的Django服务器而不是Tableau服务器,因为它是从那里提供服务的。
无需在服务器端请求HTML,只需将嵌入代码放入页面中(包括受信任的令牌,有关操作方法,请参见Tableau's Docs),然后让Tableau的嵌入脚本对其进行处理。