将 JavaScript 变量传递给 Flask url_for
- 2025-03-26 09:10:00
- admin 原创
- 10
问题描述:
我有一个端点,它接受 url 中的值并生成一些将插入到 div 中的内容。我想url_for
使用 JavaScript 变量构建 url。但是,$variable1
作为字符串传递,而不是 的值variable1
。我如何将 JavaScript 变量的值传递给url_for
?
function myFunction() {
var variable1 = "someString"
$('#demo').load(
"{{ url_for('addshare2', share = '$variable1') }}"
);
}
解决方案 1:
有时我会使用带有临时占位符字符串的以下解决方法:
var variable1 = "someString";
$('#demo').load(
"{{ url_for('addshare2', share='ADDSHARE2') }}".replace("ADDSHARE2", variable1)
);
感觉不太对劲,我仍在寻找更好的解决方案。但它确实有用。
解决方案 2:
您无法在 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 url_for
,并将参数作为表单数据传递。
$.post(
'{{ url_for('addshare2') }}',
{share: variable1},
function (data) {
// do something with data on successful response
}
);
解决方案 3:
可以通过制作模板过滤器来取消引用 url_for() 返回的文本,从而在 Jinja 中发送变量
将其添加到你的 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
解决方案 4:
如果我们想直接用 javascript 将变量发送到 url_for,我们可以像下面这样:
Link.href = "{{ url_for('addshare2', share = '') }}" + variable1
您可以通过flask或者django请求参数来获取:
@app.route('/addshare2')
def addshare2():
share = request.args.get('share', None)
...
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD