将 JavaScript 变量传递给 Flask url_for
Pass JavaScript variable to Flask url_for
我有一个端点,它在 url 中获取一个值并生成一些将插入到 div 中的内容。我想使用 JavaScript 变量构建 url 和 url_for
。但是,$variable1
作为字符串传递,而不是 variable1
的值。如何将 JavaScript 变量的值传递给 url_for
?
function myFunction() {
var variable1 = "someString"
$('#demo').load(
"{{ url_for('addshare2', share = '$variable1') }}"
);
}
您无法在 Jinja 中计算 JavaScript。您试图在 Jinja 渲染时在服务器端生成 url,但您引用的变量仅在客户端浏览器的 JavaScript 运行 中可用。
在客户端构建 url 是最直接的修复方法。 (我不知道你的路线是什么样的,所以这里有一个例子。)
$('#demo').load('/url/for/addshare2/' + variable1);
但是,这不是很有用,因为您不能使用 url_for
,因此您必须对 url 进行硬编码。这是一个好兆头,表明您想要的是一个 AJAX 传递参数的端点,而不是包含值的端点。
@app.route('/addshare2', methods=['POST'])
def addshare2():
share = request.json['share']
...
return jsonify(result=...)
现在您可以使用 url_for
生成 url,并将参数作为表单数据传递。
$.post(
'{{ url_for('addshare2') }}',
{share: variable1},
function (data) {
// do something with data on successful response
}
);
有时我会使用以下解决方法和临时占位符字符串:
var variable1 = "someString";
$('#demo').load(
"{{ url_for('addshare2', share='ADDSHARE2') }}".replace("ADDSHARE2", variable1)
);
感觉不太对,我还在寻找更好的解决方案。但它完成了工作。
可以在 Jinja 中发送一个变量,方法是制作一个模板过滤器以取消引用 url_for()
返回的文本
将此添加到您的 app.py:
from urllib.parse import unquote as urllib_unquote
@app.template_filter('unquote')
def unquote(url):
safe = app.jinja_env.filters['safe']
return safe(urllib_unquote(url))
然后在模板上执行:
function myFunction() {
var variable1 = "someString"
$('#demo').load(
`{{ url_for('addshare2', share = '${variable1}')|unquote }}`
);
}
这样就可以了。
有关自定义模板过滤器的更多信息:https://flask.palletsprojects.com/en/2.1.x/templating/#registering-filters
我有一个端点,它在 url 中获取一个值并生成一些将插入到 div 中的内容。我想使用 JavaScript 变量构建 url 和 url_for
。但是,$variable1
作为字符串传递,而不是 variable1
的值。如何将 JavaScript 变量的值传递给 url_for
?
function myFunction() {
var variable1 = "someString"
$('#demo').load(
"{{ url_for('addshare2', share = '$variable1') }}"
);
}
您无法在 Jinja 中计算 JavaScript。您试图在 Jinja 渲染时在服务器端生成 url,但您引用的变量仅在客户端浏览器的 JavaScript 运行 中可用。
在客户端构建 url 是最直接的修复方法。 (我不知道你的路线是什么样的,所以这里有一个例子。)
$('#demo').load('/url/for/addshare2/' + variable1);
但是,这不是很有用,因为您不能使用 url_for
,因此您必须对 url 进行硬编码。这是一个好兆头,表明您想要的是一个 AJAX 传递参数的端点,而不是包含值的端点。
@app.route('/addshare2', methods=['POST'])
def addshare2():
share = request.json['share']
...
return jsonify(result=...)
现在您可以使用 url_for
生成 url,并将参数作为表单数据传递。
$.post(
'{{ url_for('addshare2') }}',
{share: variable1},
function (data) {
// do something with data on successful response
}
);
有时我会使用以下解决方法和临时占位符字符串:
var variable1 = "someString";
$('#demo').load(
"{{ url_for('addshare2', share='ADDSHARE2') }}".replace("ADDSHARE2", variable1)
);
感觉不太对,我还在寻找更好的解决方案。但它完成了工作。
可以在 Jinja 中发送一个变量,方法是制作一个模板过滤器以取消引用 url_for()
返回的文本将此添加到您的 app.py:
from urllib.parse import unquote as urllib_unquote
@app.template_filter('unquote')
def unquote(url):
safe = app.jinja_env.filters['safe']
return safe(urllib_unquote(url))
然后在模板上执行:
function myFunction() {
var variable1 = "someString"
$('#demo').load(
`{{ url_for('addshare2', share = '${variable1}')|unquote }}`
);
}
这样就可以了。
有关自定义模板过滤器的更多信息:https://flask.palletsprojects.com/en/2.1.x/templating/#registering-filters