Почему bson.dumps избегает моего списка диктов (jsons) - PullRequest
0 голосов
/ 03 апреля 2019

Я использую mongo.db для размещения коллекции jsons, которую я превратил в список jsons, используя

    cursor = finder.find_pokemans(db) #this just searches the db for query and works fine
    all_pokemon = [k for k in cursor]

Но когда я передаю список в jinja2, я могу работать с ним как со списком jsons, используя следующую строку:

return render_template('index.html', list_all_pokemon = bson.json_util.dumps(all_pokemon))

эта строка в моем HTML-шаблоне (я использую встроенный js)

var all_pokemon = {{ list_all_pokemon }};

превращается в

var all_pokemon = [{"_id": {"$oid": "5ca40f82f2463129878bdd93"}, "id": 1, "name": "Bulb

Другими словами, он ускользает от всех моих цитат, поэтому его нельзя использовать как json. Я попытался jsonifying в строке понимания списка и json.dumps в передаче переменной, но я получаю эту ошибку:

TypeError: Object of type ObjectId is not JSON serializable

Есть какие-нибудь подсказки, как это исправить?

РЕДАКТИРОВАТЬ: я могу использовать

class JSONEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, ObjectId):
            return str(o)
        return json.JSONEncoder.default(self, o)
return render_template('index.html', list_all_pokemon = JSONEncoder().encode(all_pokemon))

и он будет работать нормально, но мне было интересно, почему я не могу json.dumps или jsonify, как другие сценарии, и могу ли я использовать эти форматы вместо этого здесь

1 Ответ

1 голос
/ 03 апреля 2019

{{ list_all_pokemon }} является строкой - Jinja2 будет экранировать HTML от любой строки, которая не помечена как HTML-безопасная.

Вы можете избежать этого экранирования, сделав так: {{ list_all_pokemon | safe }} ... Но так какбывает, Jinja2 знает, как это сделать самостоятельно.Это правильный способ сделать то, что вы хотите:

var all_pokemon = {{ all_pokemon | tojson }};

В старой фляге вы также должны были пометить это как безопасный, так как он не сделал это для вас ({{ all_pokemon | tojson | safe }}), но яполагаю, что текущий настой не требует от вас.

...