Flask URL routing:url_for仅传递第一个参数

时间:2015-06-10 16:18:01

标签: jquery python flask url-routing jquery-tabs

我有jQuery选项卡式面板,可在单击时在选项卡中加载页面。这很好用。我现在想要的是将其他参数传递给url,例如被点击的标签的标题。 要加载的脚本如下:

$(document).ready(function(){
$( "#content" ).load( "{{url_for(xyz, query=query)}}" );
var tabs = $('.tabs > li');
tabs.on("click", function(){
  tabs.removeClass('active');
  $(this).addClass('active');
  $( "#content" ).load( "{{url_for(xyz, query=query)}}" );
})
});

html如下:

<ul class="tabs clearfix" >
<li> 
  <a href=# >All</a> 
</li>
<li class=active >  
  <a href=# >You</a> 
</li>
<li>
  <a href=# >Me</a>
</li>

我想将标题标题作为另一个参数传递给我的烧瓶url_for。另外,检查对象属性的最佳方法是什么。我的意思是,在python中我可以使用dir(object)列出有关该对象的所有内容。是否有一种简单的方法可以在浏览器中的某个位置显示单击的选项卡对象的属性。感谢

更新 这就是我想出的:

var index = $(this).children('a')[0].title;

如果您想要标签的标题或

var index = $(this).children('a')[0].innerHTML;

现在问题是我无法将此js变量传递给url_for函数。或者更确切地说,它在我视图中的函数内显示为无

更新两次 我现在有条件,因为根据我的理解,我不能将js变量传递给jinja。

if(index=='a'){
  $( "#content" ).load( "{{url_for('xyz', index='a', query=query)}}" );
  }
  else if(index=='b'){
  $( "#content" ).load( "{{url_for('xyz', index='b', query=query)}}" );
  }
  else{
  $( "#content" ).load( "{{url_for('xyz', query=query)}}" );
  }

现在的问题是,flask只传递第一个参数,而第二个参数是None。因此,在if块中,当查询为None时索引的值经过,而在else块中,查询具有值。内部视图中的函数是

@app.route('/xyz')
def xyz():
    query = request.args.get("query")
    index = request.args.get('index')

更新3 我弄清楚问题是什么。我在jQuery加载函数中使用字符串来加载页面中的内容。 url_for创建一个格式为

的网址
/respanes?index=a&query=b

这是我需要的东西,但是当它括在引号中时,&符号被转换为&amp;,浏览器无法正确读取

/respanes?index=a&amp;query=b

所以现在我需要能够正确地逃脱它。我试图将该字符串包装在encodeURI中,但这没有用。

所以我最终不得不使用replace来完全拥有我想要的字符串。

 $( "#content" ).load('{{url_for('.xyz, index=a, query=query)}}'.replace('&amp;','&'));

希望有人能想出更好的方法来做到这一点。我想要的只是有标签面板,它将通过ajax加载页面。我不确定经历所有这些箍是什么需要但希望像我这样的一些菜鸟可以从我的挣扎中收集:)

1 个答案:

答案 0 :(得分:3)

我参加派对有点晚了,但我遇到了同样的问题。正确的解决方案非常简单:使用Jinja2 safe过滤器强制输出原始字符串,而不是使用Web安全实体对其进行格式化。

{{url_for('x.y', index=a, query=query) | safe}}

有关过滤器的更多信息,请访问:http://jinja.pocoo.org/docs/dev/templates/#safe