Flask url_for Javascript中的URL

Eri*_*off 35 javascript python url-for flask

使用flask时,在Javascript文件中创建动态URL的推荐方法是什么?在jinja2模板和python视图url_for中使用,在.js文件中执行此操作的建议方法是什么?因为它们不是由模板引擎解释的.

基本上想做的是:

// in comments.js
$.post(url_for('comment.comment_reply'));
Run Code Online (Sandbox Code Playgroud)

这是不可能的.

但很自然地,我可以在模板中执行它:

<script>
    $.post(url_for('comment.comment_reply'));
</script>
Run Code Online (Sandbox Code Playgroud)

小智 31

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

添加后{{ JSGlue.include() }},您可以在源代码中执行以下操作:

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

要么:

<script>
    location.href = Flask.url_for('index', {});
</script>
Run Code Online (Sandbox Code Playgroud)

  • @Collin在安全性方面,您通常认为您的攻击者知道您的系统如何工作(注意"系统如何工作"确实排除了密码,密钥等).即使攻击者知道终点,您的系统也应该是安全的.还有其他方法来获取它们,例如社交工程,感染合法用户的机器,我确信列表还在继续.依赖于不知道端点的攻击者是"通过默默无闻的安全"的形式,并且在实践中,这种技术通常不能很好地适应真正的攻击者. (3认同)
  • @Collin还要记住,您的网址基本上是*公共信息.您的许多用户都会了解它们,因此无论如何都很难保护它们.而且你真的只暴露了*模式*,所以攻击者仍然需要模式的输入.我不认为这种小的信息暴露会大大增加您的风险. (2认同)

dum*_*ter 15

瓶文档建议使用url_for在HTML文件中设置包含您可以访问其他地方的根URL的变量.然后,您必须手动构建视图URL,尽管我猜您可以将它们存储为类似于根URL.


小智 5

正在寻找解决方案,他们提出了这个解决方案,其中

  • 不需要附加组件

  • 没有硬编码的 URL

关键是要实现Jinja2具有开箱即用的渲染 javascript 的能力。


将您的模板文件夹设置为如下所示:

/template
    /html
        /index.html
    /js
        /index.js
Run Code Online (Sandbox Code Playgroud)

在你的 views.py 中

@app.route("/index_js")
def index_js():
    render_template("/js/index.js")
Run Code Online (Sandbox Code Playgroud)

现在,而不是从您的静态文件夹中提供 javascript。你会使用:

<script src="{{ url_for('index_js') }}"></script>
Run Code Online (Sandbox Code Playgroud)

毕竟,您正在动态生成 javascript,它不再是静态文件。


现在,在您的 javascript 文件中,只需url_for像在任何html文件中一样使用 。

例如Jquery用于发出 Ajax 请求

$.ajax({
  url: {{ url_for('endpoint_to_resource') }},
  method: "GET",
  success: call_back()
})
Run Code Online (Sandbox Code Playgroud)

  • 我实际上已经使用了这个解决方案,但重要的是要注意使用 jinja2 呈现所有 javascript 文件的性能影响,以及它对缓存的潜在影响。 (5认同)
  • 感谢您提供替代解决方案。请注意,您的视图函数中有一个拼写错误。它应该是 ```return render_template("/js/index.js")``` 而不是 ```render_template("/js/index.js")``` (2认同)