我正在使用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/

10-12 23:27