将变量从 Flask 传递到 JavaScript
Passing variables from Flask to JavaScript
我查看了类似的论坛,但无法找到任何有效的解决方案。我正在尝试将变量从 Flask 传递到我的 JavaScript 文件。然后这些值将用于我的 JavaScript 文件中的 PubNub。
这是我的 Python 代码的一部分:
@app.route("/mysettings/")
def user_settings():
return render_template('Settings.html', project_name = session['project_name'] , publish_key = session['publish_key'] , subscribe_key = session['subscribe_key'] )
这是我的 JavaScript 代码的一部分 (app.js):
var settings = {
channel: {{project_name}},
publish_key: {{publish_key}},
subscribe_key: {{subscribe_key}}
};
如果我在我的 Settings.html 文件中使用此代码但在 app.js 文件中不使用它,则此代码有效。
原因是需要使用 jinja2
来执行替换,而从您的代码看来这并没有发生。
您有可能 app.js
作为静态文件提供服务,这意味着模板引擎机器永远不会查看它,只是按原样提供。
您可以通过从 URL 提供 app.js
来完成您所描述的内容,该 URL 与将 app.js
的内容传递到 Flask 的 render_template
的操作相关联函数,执行 jinja2
替换,以及所有其他自定义信息,但这意味着 jinja2
必须 解析整个文件 ,这可能很昂贵。
您可以尝试使用 AJAX 请求来传递这些变量,该请求由在 JSON 中发回相同数据的操作响应。这是一种更为常见的做法,并且具有使该数据对其他资源可见的附加值。
mobiusklein 的答案非常好,但您应该考虑“hack”。定义您的 Javascript 方法以接收参数并将数据作为参数发送到您的函数。
main.py
@app.route('/')
def hello():
data = {'username': 'Pang', 'site': 'whosebug.com'}
return render_template('settings.html', data=data)
app.js
function myFunc(vars) {
return vars
}
settings.html
<html>
<head>
<script type="text/javascript" {{ url_for('static', filename='app.js')}}></script>
<script type="text/javascript">
myVar = myFunc({{data|tojson}})
</script>
</head>
</html>
使用@mauro 提到的简单示例将变量从 flask 视图传递到模板到 javascript 文件的简单方法。
main.py
@app.route('/')
def hello():
data = {'username': 'Pang', 'site': 'whosebug.com'}
return render_template('settings.html', data=data)
settings.html
<html>
<head>
<script type="text/javascript">
var username = {{ data.username }}
var site = {{ data.site }}
</script>
<script type="text/javascript" src="app.js"></script>
</head>
</html>
app.js
function myFunc() {
return username + site
}
<script type="text/javascript">
var username ='{{ data.username }}'
var site ='{{ data.site}}'
<script>
我查看了类似的论坛,但无法找到任何有效的解决方案。我正在尝试将变量从 Flask 传递到我的 JavaScript 文件。然后这些值将用于我的 JavaScript 文件中的 PubNub。
这是我的 Python 代码的一部分:
@app.route("/mysettings/")
def user_settings():
return render_template('Settings.html', project_name = session['project_name'] , publish_key = session['publish_key'] , subscribe_key = session['subscribe_key'] )
这是我的 JavaScript 代码的一部分 (app.js):
var settings = {
channel: {{project_name}},
publish_key: {{publish_key}},
subscribe_key: {{subscribe_key}}
};
如果我在我的 Settings.html 文件中使用此代码但在 app.js 文件中不使用它,则此代码有效。
原因是需要使用 jinja2
来执行替换,而从您的代码看来这并没有发生。
您有可能 app.js
作为静态文件提供服务,这意味着模板引擎机器永远不会查看它,只是按原样提供。
您可以通过从 URL 提供 app.js
来完成您所描述的内容,该 URL 与将 app.js
的内容传递到 Flask 的 render_template
的操作相关联函数,执行 jinja2
替换,以及所有其他自定义信息,但这意味着 jinja2
必须 解析整个文件 ,这可能很昂贵。
您可以尝试使用 AJAX 请求来传递这些变量,该请求由在 JSON 中发回相同数据的操作响应。这是一种更为常见的做法,并且具有使该数据对其他资源可见的附加值。
mobiusklein 的答案非常好,但您应该考虑“hack”。定义您的 Javascript 方法以接收参数并将数据作为参数发送到您的函数。
main.py
@app.route('/')
def hello():
data = {'username': 'Pang', 'site': 'whosebug.com'}
return render_template('settings.html', data=data)
app.js
function myFunc(vars) {
return vars
}
settings.html
<html>
<head>
<script type="text/javascript" {{ url_for('static', filename='app.js')}}></script>
<script type="text/javascript">
myVar = myFunc({{data|tojson}})
</script>
</head>
</html>
使用@mauro 提到的简单示例将变量从 flask 视图传递到模板到 javascript 文件的简单方法。
main.py
@app.route('/')
def hello():
data = {'username': 'Pang', 'site': 'whosebug.com'}
return render_template('settings.html', data=data)
settings.html
<html>
<head>
<script type="text/javascript">
var username = {{ data.username }}
var site = {{ data.site }}
</script>
<script type="text/javascript" src="app.js"></script>
</head>
</html>
app.js
function myFunc() {
return username + site
}
<script type="text/javascript">
var username ='{{ data.username }}'
var site ='{{ data.site}}'
<script>