我正在使用Flask和Knockout一起在一个web应用程序中使用Jinja2作为模板引擎。在烧瓶应用程序中,我有两条路径:/accounts/
和/accounts/<int:acc_id>/
,它们看起来像这样:
@app.route("/accounts/")
@login_required
def accounts():
return render_template("accounts.html")
@app.route("/accounts/<int:acc_id>/")
@login_required
def account(acc_id):
return render_template("account.html",
account_id=acc_id)
/accounts/
路由加载一个带有淘汰视图模型的HTML页面。然后,视图模型AJAX将帐户列表加载到observableArray
中,并呈现如下内容:<!-- ko foreach: accounts -->
<span data-bind="text: name></span>
<!-- /ko -->
/accounts/<int:acc_id>/
路由显示有关单个帐户的信息。我要做的是使用
href
在上面的HTML代码片段中为每个帐户创建一个url_for()
属性,将帐户的id作为参数传递。使用Knockout模型中的参数对url_for()
进行Python调用时遇到问题。到目前为止,我已经尝试了几个变体:
将id连接到函数调用的url中:
<a data-bind="attr: { href: '{{ url_for('account', acc_id=' + id() + ' }}'}">
<span data-bind="text: name"></span>
</a>
这将生成一个
ValueError: invalid literal for int() with base 10: '+ id() +'
,因为它将对id()的调用读取为字符串文本。在视图模型中创建返回字符串url的函数:
self.accountUrl = function(account_id) {
return '{{ url_for("admin.account", acc_id=' + account_id + ') }}';
};
这样称呼:
<a data-bind="attr: { href: $root.accountUrl(id()) }">
<span data-bind="text: name"></span>
</a>
这将导致将href属性设置为从
accountUrl()
返回的字符串文字,即HTML如下所示:<a href='{{ url_for("account", acc_id=1) }}'>
我觉得这里有些东西我必须要忽略。有什么想法吗?
最佳答案
生成HTML时,python代码(url_for
)在服务器端运行,而呈现页面时,Knockout代码在浏览器中运行。因此不能将变量从Knockout传递到pythonurl_for
方法。
您可以做的是只生成/accounts/
并使用KO构建URL的其余部分:
<a data-bind="attr: { href: '{{ url_for('account') }}' + '/' + id() }">
<span data-bind="text: name"></span>
</a>
关于python - Jinja2:Flask的url_for()与Knockout的attr绑定(bind)结合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15931015/