Как преобразовать список объектов Python + Flask в список JS объектов? - PullRequest
0 голосов
/ 28 апреля 2020

Вот приложение Flask, которое содержит список объектов.

from flask import *

app = Flask(__name__)

class Entry: 

    def __init__(self, name, surname):
        self.name = name
        self.surname = surname

entries = [] 

entries.append(Entry('Paul', 'McCartney'))
entries.append(Entry('John', 'Lennon'))
entries.append(Entry('George', 'Harrison'))
entries.append(Entry('Ringo', 'Starr')) 

@app.route('/')
def index():
    return render_template('index.html', entries = entries) 

if __name__ == '__main__':
    app.run(debug=True)

Вот индекс. html file:

<html>

<head>
</head>

<body>
    <script>

    var entries = "{{entries[0].name}}"
    console.log(entries)

    </script> 
</body>

</html>

В этом случае все работает нормально, и вывод консоли составляет Paul, как и ожидалось.

Но когда я изменяю код на это,

var entries = "{{entries}}"
console.log(entries[0].name)

Консоль выводит undefined

Если мы говорим console.log(entries) в этом случае, она возвращает следующее:

[&lt;__main__.Entry object at 0x1065a2278&gt;, &lt;__main__.Entry object at 0x1065a22b0&gt;, 
&lt;__main__.Entry object at 0x1065a22e8&gt;, &lt;__main__.Entry object at 0x1065a2208&gt;] 

Я предполагаю, что необходимо как-то преобразовать этот список объектов в формат JS, я прав? Как это сделать правильно? Большое спасибо!

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

entries - это список Entry Python объектов. Лучший способ получить это в JavaScript объекте - использовать JSON. JSON - отличный формат для передачи между системами, но вам нужно сериализовать свой список, чтобы сделать это. json.dumps() работает только с простыми данными, а не с пользовательскими классами. Что вы можете сделать, это преобразовать ваш список Entry объектов в список объектов словаря.

main.py:

from flask import *
import json

@app.route('/')
def index():
    return render_template('index.html', entries=json.dumps([ob.__dict__ for ob in entries]))

Затем на странице html вы можете использовать safe фильтр внутри вашего шаблона. Это говорит jinja2, что содержимое безопасно отображать как есть, и не экранировать html / javascript.

index. html:

<script>
    var entries = {{ entries|safe }}
    console.log(entries)
</script>
1 голос
/ 28 апреля 2020

Хорошо, я тоже столкнулся с этой ошибкой. Лучший способ (я думаю, это), преобразовав его в JSON объект и отправив его.

flask:

import json

@app.route('/')
def index():
    jobj = {'data' : entries }
    return render_template('index.html', res=json.dumps(jobj)) 

javascript:

var res = JSON.parse('{{ res | safe }}');
console.log(res.data);
...