将 requests.get 的结果加载到 Django 模板(画面)中?
Load result from requests.get into django template (tableau)?
我有一个超小(单视图)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 页面?我似乎不知道该怎么做。
要嵌入 Tableau,您应该使用他们的 embed code (script tag)
或使用 Tableau JS API。在幕后,任何一条路线最终都会创建一个带有视图 URL 的 iframe。
您正在做的是从 Tableau 获取 HTML 并将其插入服务器端的网页,然后由您的 Django 服务器提供。当该 HTML 引用的资产尝试加载时,它会查看您的 Django 服务器而不是 Tableau 服务器,因为它是从那里提供服务的。
无需在服务器端请求 HTML,只需将嵌入代码放入您的页面(包括受信任的令牌,请参阅 Tableau's Docs 了解如何执行此操作)并让 Tableau 的嵌入脚本处理一下。
我有一个超小(单视图)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 页面?我似乎不知道该怎么做。
要嵌入 Tableau,您应该使用他们的 embed code (script tag) 或使用 Tableau JS API。在幕后,任何一条路线最终都会创建一个带有视图 URL 的 iframe。
您正在做的是从 Tableau 获取 HTML 并将其插入服务器端的网页,然后由您的 Django 服务器提供。当该 HTML 引用的资产尝试加载时,它会查看您的 Django 服务器而不是 Tableau 服务器,因为它是从那里提供服务的。
无需在服务器端请求 HTML,只需将嵌入代码放入您的页面(包括受信任的令牌,请参阅 Tableau's Docs 了解如何执行此操作)并让 Tableau 的嵌入脚本处理一下。