Jinja2:Flask的url_for()与Knockout的attr绑定结合使用

问题描述:

我在使用Jinja2作为模板引擎的Web应用程序中一起使用Flask和Knockout。在我的瓶的应用程序,我有两个途径:/accounts//accounts/<int:acc_id>/,这是这个样子:Jinja2:Flask的url_for()与Knockout的attr绑定结合使用

@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>/路线显示的信息。

我想要做的是使用url_for()在上面的HTML片段中的每个帐户上创建一个href属性,将该帐户的ID作为参数传递。我无法使用Knockout模型中的参数对url_for()进行Python调用。

一对夫妇的变化到目前为止,我已经试过的:

串联标识加入url_for函数调用:

<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_for字符串视图模型的函数:

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) }}'> 

我觉得在这里我必须忽略一些东西。有任何想法吗?

+0

是'url_for()'服务器端功能?或者它在浏览器的客户端上运行? – PatrickSteele 2013-04-11 02:46:21

您的python代码(url_for)在生成HTML时运行在服务器端,但在页面呈现时,Knockout代码在浏览器中运行您的代码。所以你不能将Knockout的变量传递给python url_for方法。

你可以做的是只产生/accounts/并建立URL与KO休息:

<a data-bind="attr: { href: '{{ url_for('account') }}' + '/' + id() }"> 
    <span data-bind="text: name"></span> 
</a> 
+0

啊,当然,现在你说出来就有道理了。我现在感觉有点傻。 不幸的是,您的解决方案无法正常工作,因为如果您不提供所需的参数,Flask的url_for()会失败。但是,我可以通过其他方式解决它。非常感谢! – Limescale 2013-04-11 09:08:52