2012-04-25 112 views
28

使用烧瓶时,建议在JavaScript文件中创建动态网址的方式是什么?在jinja2模板中,使用url_for的python视图内,在.js文件中建议使用这种方法吗?因为它们不被模板引擎解释。Flask url_for Javascript中的网址

什么基本上想要做的是:

// in comments.js 
$.post(url_for('comment.comment_reply')); 

这是不可能的。

不过自然,我可以执行,在一个模板:

<script> 
    $.post(url_for('comment.comment_reply')); 
</script> 

回答

24

What @ dumbmatter的建议几乎被认为是事实上的标准方式。但我认为会有更好的方式来做到这一点。所以我设法开发了这个插件:Flask-JSGlue

加入{{ JSGlue.include() }}后,你可以做以下的源代码:

<script> 
    $.post(Flask.url_for('comment.comment_reply', {article_id: 3})); 
</script> 

或:

<script> 
    location.href = Flask.url_for('index', {}); 
</script> 
+0

太棒了! 2012年我正在寻找什么。:)我会改变接受的答案,因为这是更好的 – ErikPerik 2015-01-07 10:14:08

+0

这是否允许您在页面运行时使用JavaScript变量来指定参数以构建url的url_for?这是你的示例代码中的article_id是什么意思? – ThatAintWorking 2015-05-19 19:10:55

+0

是的,@ThatAintWorking。这可以与您在Flask上的视图函数中使用的完全相同。这是一个客户端实现。 – 2015-05-21 00:31:32

13

Flask documentation建议在HTML文件中使用url_for设置包含您可以访问其他地方的根URL的变量。然后,您将不得不手动构建视图网址,尽管我猜你可以将它们存储为与根网址相似的网址。

+0

这并不是说很漂亮,但我想它会做! – ErikPerik 2012-05-09 08:56:16

+0

现在我再想一想,编写一个Flask扩展可以看到在Python代码中定义的URL路由,并动态地将其转换为等价的JavaScript代码,从而提供了一个等效的url_for '在JavaScript中? – dumbmatter 2012-05-09 14:47:40

3

@杰里米的答案是正确的,可能更常见的做法,但是作为一个备选答案,请注意dantezhu撰写并发表了flask extension声称可以做精确的URL路由映射成JavaScript翻译注释建议。

2

我用这个肮脏和丑陋伎俩:

"{{url_for('mypage', name=metadata.name,scale=93,group=2)}}" 
.replace('93/group',scale+'/group') 

其中scale是JavaScript变量我想使用AJAX请求。 因此,在运行时,url_for生成一个URL和JavaScript替换参数。生成的代码是这样的:

"/ajaxservive/mynam/scale/93/group/2".replace('93/group',scale+'/group') 

这是很奇怪,但仍然找不到更优雅的解决方案。

事实上,链接瓶扩展的looking at the code,它做同样的事情,但管理一般情况。

0

在我的情况下, 我试图动态创建URL

我解决了我的问题,如下所示(注意:我已经将Angular的语法换成了{[x]}:

<ul> 
    <li ng-repeat="x in projects"> 
     {[x.title]} 
     {% set url = url_for('static',filename="img/") %} 

     <img src="{{url}}{[x.img]}"> 
    </li> 
</ul> 
2

正在寻找解决的办法,他们想出了这个解决方案,其中没有附加要求

  • 没有硬编码URL

关键是要实现Jinja2有能力呈现jav ascript开箱即用。


设置您的模板文件夹类似如下:

/template 
    /html 
     /index.html 
    /js 
     /index.js 

在你views.py

@app.route("/index_js") 
def index_js(): 
    render_template("/js/index.js") 

现在,而不是从你的静态服务的JavaScript夹。你会用:

<script src="{{ url_for('index_js') }}"></script> 

毕竟,你正在生成的JavaScript,它不再是一个静态文件。现在


,你内心的JavaScript文件,只需使用url_for,你会在任何html文件。

例如使用Jquery,使Ajax请求

$.ajax({ 
    url: {{ url_for('endpoint_to_resource') }}, 
    method: "GET", 
    success: call_back() 
}) 
+1

我已经使用过这个解决方案,但重要的是要注意使用jinja2渲染所有javascript文件对性能的影响,以及它对缓存的潜在影响。 – Collin 2016-05-16 13:16:15

-2

我的建议是:

<script src="{{ url_for('static', filename='js/jquery.js') }}" type="text/javascript"> 
</script> 

工作正常,我