【问题标题】:Passing variables from Flask to JavaScript将变量从 Flask 传递到 JavaScript
【发布时间】:2016-09-12 14:04:42
【问题描述】:

我查看了类似的论坛,但无法让任何解决方案发挥作用。我正在尝试将变量从 Flask 传递到我的 JavaScript 文件。然后这些值将用于我的 JavaScript 文件中的 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 文件中使用此代码。

【问题讨论】:

    标签: javascript python flask pubnub


    【解决方案1】:

    mobiusklein 的答案非常好,但您应该考虑“黑客”。定义您的 Javascript 方法以接收参数并将数据作为参数发送到您的函数。

    ma​​in.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({{data|tojson}})
             </script>
        </head>
    </html>
    

    【讨论】:

    • 这对我来说似乎很正常,而不是 hack。
    • vars/tojson:这挽救了我作为非网络开发人员的生命 :D 谢谢
    • @MauroBaraldi 不,我有 @context_processor 用于翻译字典,需要链接一些 js 单独文件,并且在该文件中需要使用 {{translations.somevar|tojson}},这可能吗?跨度>
    • 你的意思是{{data|tojson}}
    • 仅供参考 - tojson 和其他过滤器的文档:jinja.palletsprojects.com/en/2.11.x/templates/#builtin-filters
    【解决方案2】:

    通过@mauro 提到的简单示例将变量从flask 视图传递到模板到javascript 文件的简单方法。

    ma​​in.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
    }
    

    【讨论】:

    • 这个答案只有在我将 data.username 更改为 data.username|tojson 后才对我有用(我正在传递名称包含斜杠的变量,例如“/example/name”,如果这很重要的话。)
    • 按照下面的@joash 回答,变量应该被分配给烧瓶变量
    【解决方案3】:
    <script type="text/javascript">
       var username ='{{ data.username }}'
       var site ='{{ data.site}}'
    <script>
    

    【讨论】:

      【解决方案4】:

      原因是需要使用 jinja2 来执行替换,而从您的代码中似乎没有发生这种情况。

      您可能将 app.js 作为静态文件提供服务,这意味着模板引擎机器永远不会查看它,而是按原样提供。

      您可以通过从 URL 提供 app.js 来完成您所描述的事情,该 URL 与通过 Flask 的 render_template 函数传递 app.js 内容的操作、执行 jinja2 替换以及所有其他操作相关联自定义信息,但这意味着 jinja2 必须解析整个文件,这可能很昂贵。

      您可能会尝试使用 AJAX 请求来传递这些变量,该请求由以 JSON 格式发回相同数据的操作做出响应。这是一种更为常见的做法,并且具有使该数据对其他资源可见的附加价值。

      【讨论】:

        猜你喜欢
        • 2021-12-30
        • 1970-01-01
        • 2017-06-12
        • 2016-07-08
        • 2022-07-17
        • 2011-11-14
        • 2017-06-03
        • 2013-07-17
        相关资源
        最近更新 更多