2012-04-25 151 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> 

工作正常,我