【问题标题】:How to serialize a python class to pass onto javascript如何序列化python类以传递给javascript
【发布时间】:2020-07-17 15:53:54
【问题描述】:

我正在尝试将变量传递给烧瓶中的 javascript。 但我收到以下错误:TypeError: Object of type MyClass is not JSON serializable

代码:

routes.py:

@app.route('/')
@app.route('/index')
def index():
    data = {
        "foo": myObj
    }
    return render_template('index.html', data=data)

注意myObj 是MyClass 类型的自定义类对象。

index.html:

    <script src="{{ url_for('static', filename='my_script.js', type="module") }}" crossorigin="anonymous"
            defer>
    </script>
    <script>
        let data = {{ data|tojson }};
    </script>

my_script.js:

console.log(data);

我试图简单地写 {{ data }} 而不是 {{ data|tojson }} 但我得到了错误: Uncaught SyntaxError: Unexpected token '&amp;'my_script.js?type=module:1 Uncaught ReferenceError: data is not defined at my_script.js?type=module:1

我知道有很多问题,但我找不到解决这个问题的问题。

【问题讨论】:

    标签: javascript python html flask jinja2


    【解决方案1】:

    这里的问题是您试图将 Python 对象传递给 Javascript。这是行不通的。最好的办法是把它转换成 JSON,它在 Python 和 Javascript 之间是兼容的。

    使用json 模块,您可以序列化您的字典。但是,MyClass 的 Python 对象不是 JSON 可序列化的。您应该能够序列化 __data__ 属性,它是对象中的属性字典。

    像这样改变你的 Python:

    import json
    
    @app.route('/')
    @app.route('/index')
    def index():
        data = {
            "foo": myObj.__dict__
        }
        return render_template('index.html', data=json.dumps(data))
     
    

    【讨论】:

    • 确实有效。我不知道我应该将它作为字符串传递,应该提到的是,在 javascript 中,如果需要作为对象,应该重新组装 json。 data = JSON.parse(data) 就我而言。
    猜你喜欢
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    相关资源
    最近更新 更多