web-dev-qa-db-ja.com

変数をflaskからjavascriptに渡す

同様のフォーラムを見ましたが、どのソリューションも機能しませんでした。変数をflask=からmy Javaスクリプトファイルに渡します。これらの値は、j​​avascriptファイルからPubNubに使用されます。

ここに私の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}}
    };

このコードは、Settings.htmlファイルで使用し、app.jsファイルでは使用しない場合に機能します。

19
pang

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>
22
Mauro Baraldi

flaskビューからテンプレートへの変数を渡す簡単な方法は、@ 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
}
17
shrishinde

その理由は、jinja2を使用して置換を実行する必要がありますが、これはコードからは発生していないようです。

提供している可能性はapp.js静的ファイルとして。つまり、テンプレートエンジンの機械によって見られることはなく、そのまま提供されることを意味します。

あなたが説明していることを達成するには、app.jsのコンテンツを渡すアクションに関連付けられているURLからapp.js Flaskのrender_template関数、実行jinja2置換、および他のすべてのカスタマイズ情報。ただし、それはjinja2にはファイル全体を解析するが必要です。

JSONで同じデータを送り返すアクションによって応答されるAJAXリクエストを使用して、これらの変数を渡そうとする場合があります。これは、はるかに一般的な方法であり、他のリソースから見えるデータ。

3
mobiusklein