在javascript中访问python列表作为数组

时间:2014-04-13 03:16:42

标签: javascript python flask

我在烧瓶views.py

中有这个
    def showpage():
      ...
      test = [1,2,3,4,5,6]
      return render_template("sample.html",test=test)

我的样本中有这个.html

    <script> var counts = {{test}}; </script>

这给了我一个空的计数变量。如何获得与python中的测试列表相同的计数?

5 个答案:

答案 0 :(得分:18)

  1. 将变量插入模板{{ test }}时,需要使用对象表示。对于int [1,2,3,4,5,6]的列表,它将呈现为[1, 2, 3, 4, 5, 6],因此它是有效的javascript数组,但此方法不是安全的复杂对象,没有类似javascript的表示,例如,test = [1,2, 3,4,5,任何]将呈现为[1, 2, 3, 4, 5, &lt;built-in function any&gt;],但这只是示例,永远不会有效。

  2. 要隐含地转换为烧瓶中的javascript对象{@ 3}}过滤器:

    <script> var counts = {{ test|tojson }}; </script>
    

    因此,如果对象是JSON可序列化的,那么所有对象都将呈现,否则模板引擎将引发异常。

  3. 您还可以将javascript代码发送到您的模板:

    from flask import json
    return render_template("sample.html",test=json.dumps(test))
    

    但这不是一个好方法,它可以更好地使用也是HTML标记安全的tojson过滤器。

  4. 我更喜欢不在模板中混合任何javascript代码,并使用ajax分割模板,javascript和javascript数据。如果这种方法很难,我宁愿使用tojson过滤器。

答案 1 :(得分:7)

您在烧瓶视图中使用json.dumps,在javascript代码中使用JSON.parse

在python视图中:

def showpage():
    ...
    test = [1,2,3,4,5,6]
    test = json.dumps(test)
    return render_template("sample.html",test=test)

在JavaScript代码中:

<script> var counts = JSON.parse("{{ test }}"); </script>

答案 2 :(得分:3)

您也可以使用

import requests


class MyApi(object):

    base_api_url = 'http://myapi.local:8000'
    _token = None

    def _login(self, token):
        self._token = token

    @property
    def _auth_header(self):
        if self._token is None:
            raise Exception('fetch the token first!')
        return {'Authorization': 'JWT {}'.format(self._token)}

    def call_login(self, username, password):
        response = requests.post(
            '/api/login/', json={
                'username': username,
                'password': password,
            }
        )
        response.raise_for_status()
        self._login(response.json()['token'])

    def call_list_data(self):
        response = requests.post(
            '/api/login/', headers=self._auth_header
        )
        response.raise_for_status()
        return response.json()

{{ test|safe }} 

{{ test|tojson|safe }} 过滤器将在脚本标记中使用。

答案 3 :(得分:0)

您尝试从python showpage函数返回字典,如下所示,它将起作用:

def showpage():
    """Your logic for getting the list to return """
    test_dict = {"data_list": [1,2,3,4,5]}
    return render_template("sample.html", test=test_dict)

答案 4 :(得分:0)

我从不喜欢使用json.dumps。在此解决方案中,数组不是特殊情况。只需将数组和任何其他变量放入对象中即可:

Python

@app.route('/somePath')
def example():
    data = {
        'robotNames': ['Wall-E', 'Bender', 'Rosie']
    }
    return render_template('index.html', data=data)

JavaScript

<script>
    var flaskData = JSON.parse('{{data | tojson | safe}}');

    var robots = flaskData.robotNames;
    robots.forEach(function (robot) {
        console.log(robot);
    });
</script>