ホームページ > ウェブフロントエンド > jsチュートリアル > Jinja テンプレートから JSON データをレンダリングするときに、JSON.parse が「SyntaxError: Unexpected token '&'」で失敗するのはなぜですか?

Jinja テンプレートから JSON データをレンダリングするときに、JSON.parse が「SyntaxError: Unexpected token '&'」で失敗するのはなぜですか?

DDD
リリース: 2024-12-29 12:26:17
オリジナル
1021 人が閲覧しました

Why Does JSON.parse Fail with a

Jinja テンプレートから JSON データをレンダリングするときに JavaScript SyntaxError が発生する

問題の説明

JavaScript を使用して Jinja テンプレートでレンダリングされた JSON データを反復処理しようとすると、ブラウザは「SyntaxError: Unexpected token '&'」エラーをスローします。この問題は、レンダリングされたデータに対して JSON.parse を呼び出すときに発生します。

解決策

Flask のテンプレート エスケープ

Flask の Jinja 環境は、セキュリティを軽減するためにテンプレートでレンダリングされたデータに自動 HTML エスケープを適用します。リスク。ただし、このエスケープはデータを JSON として解釈するのを妨げる可能性があります。

Flask は、この問題に対処するための tojson フィルターを提供します。 Python オブジェクトを JSON に変換し、レンダリングしても安全であるとマークします。

return render_template('tree.html', tree=tree)
ログイン後にコピー
ログイン後にコピー

テンプレート内:

var tree = {{ tree|tojson }};
ログイン後にコピー

非 JSON レンダリング

データがJavaScript による使用を目的としていないため、tojson フィルターは不要です。必要に応じて、Python データを直接渡し、テンプレートでそれを利用することを検討してください。

return render_template('tree.html', tree=tree)
ログイン後にコピー
ログイン後にコピー

テンプレート内:

{% for item in tree %}
    <li>{{ item }}</li>
{% endfor %}
ログイン後にコピー

エスケープの無効化

エスケープが必要ない場合すでに JSON データを文字列として持っている場合は、安全なフィルターを使用してエスケープを無効にするか、マークアップ。

安全なフィルターの使用:

return render_template('tree.html', tree=Markup(json.dumps(tree)))
ログイン後にコピー

テンプレート内:

var tree = {{ tree }};
ログイン後にコピー

マークアップの使用:

return render_template('tree.html', tree=json.dumps(tree))
ログイン後にコピー

でテンプレート:

var tree = {{ tree|safe }};
ログイン後にコピー

以上がJinja テンプレートから JSON データをレンダリングするときに、JSON.parse が「SyntaxError: Unexpected token '&'」で失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート