2016-05-16 152 views
5

我看了類似的論壇,但無法獲得任何解決方案的工作。我試圖從燒瓶傳遞變量到我的Java腳本文件。這些值然後將用於我的JavaScript文件中的PubNub。將變量從瓶子傳遞到javascript

這裏是我的Python代碼的一部分:

@app.route("/mysettings/") 
def user_settings(): 
     return render_template('Settings.html', project_name = session['project_name'] , publish_key = session['publish_key'] , subscribe_key = session['subscribe_key']) 

這裏是我的javascript代碼部分(app.js):

var settings = { 
     channel: {{project_name}}, 
     publish_key: {{publish_key}}, 
     subscribe_key: {{subscribe_key}} 
    }; 

此代碼的工作,如果我在我的設置使用它。 html文件,但不在app.js文件中。

回答

10

mobiusklein答案很不錯,但有「黑客」你應該考慮。定義您的Javascript方法來接收參數並將數據作爲參數發送到您的函數。

main.py

@app.route('/') 
def hello(): 
    data = {'username': 'Pang', 'site': 'stackoverflow.com'} 
    return render_template('settings.html', data=data) 

app.js

function myFunc(vars) { 
    return vars 
} 

settings.html

<html> 
    <head> 
     <script type="text/javascript" {{ url_for('static', filename='app.js')}}></script> 
     <script type="text/javascript"> 
      myVar = myFunc({{vars|tojson}}) 
     </script> 
    </head> 
</html> 
+1

這似乎是正常的我,不是黑客攻擊。 –

+1

vars/tojson:這節省了我作爲非web開發人員的生活:D謝謝 – Oxydron

1

原因是jinja2需要用來執行替代,它從你的代碼似乎並沒有發生。

很有可能你服務於app.js作爲一個靜態文件,這意味着它從來沒有被模板引擎機器看到,只是服務於此。

你可以完成你從綁定在其經過的app.js通過瓶的render_template功能內容的動作URL服務app.js,執行jinja2換人描述什麼,和所有其他的定製信息,但這意味着jinja2必須解析整個文件,這可能是昂貴的。

您可能會嘗試使用AJAX請求傳遞這些變量,該請求通過在JSON中發送相同數據的操作響應。這是一種非常普遍的做法,並且具有使該數據對其他資源可見的附加價值。

6

簡單的方法來傳遞變量從燒瓶視圖到模板,以及@mauro提到的簡單示例的JavaScript文件。

main.py

@app.route('/') 
def hello(): 
    data = {'username': 'Pang', 'site': 'stackoverflow.com'} 
    return render_template('settings.html', data=data) 

settings.html

<html> 
    <head> 
     <script type="text/javascript"> 
      var username = {{ data.username }} 
      var site = {{ data.site }} 
     </script> 
     <script type="text/javascript" src="app.js"></script> 
    </head> 
</html> 

app.js

function myFunc() { 
    return username + site 
} 
+1

只有在將'data.username'更改爲'data.username | tojson'後,此答案才適用於我(我傳遞的變量的名稱包含斜槓,例如「/ example/name」)。) – Sam