2011-12-30 13 views
2

入れ子の辞書をMakoのテンプレートに戻そうとしたとき、一重引用符がHTMLコード'(ブラウザのソースコードで見た)で置き換えられました。ビューでピラミッドの入れ墨された辞書をMakoテンプレートに戻すにはどうすればいいですか?

:マコで

@view_config(route_name='main', renderer='myproj:templates/main.mako') 
def main_view(request): 
    info = {'name': 'Some', 'age': 20} 
    return {'info': info, 'country': 'Ukraine'} 

:ブラウザのソースコードで

<script type="text/javascript">func(${info})</script> 

:このエスケープを避けるために、どのように

<script type="text/javascript">func({&#39;name&#39;: &#39;Some&#39;, &#39;age&#39;: 20})</script> 

? (renderer='json'は、私がMakoでその辞書を必要としているため変種ではありません)

+0

あなたがPythonとMakoの両方のスニペットで行っていたことの例を挙げたら、おそらくこれに答えることができました。 –

+0

私はコード例で私の質問を編集しました。前もって感謝します! –

+0

@Michael Merickel - 私の編集をご覧ください。 –

答えて

6

Makoはデフォルトでエスケープ文字列に設定されています。フィルタを無効にする場合は、|nで行うことができます。具体的には${info|n}。あなたの例では

は、しかし、あなたはJavaScriptの機能にのpython辞書を渡そうとしています。これは明らかに追加されませんし、あなたはPythonのディクテーションをjavascriptで使用可能なものにする必要があります。あなたが実際にここでやってみたいのは、Pythonの辞書を文字列に変換し、それをJavaScriptコードにフィルタリングしないで出力することです。

これはアップprettiedすることができますが、アイデアはPythonであなたが行うことです。

@view_config(route_name='main', renderer='myproj:templates/main.mako') 
def main_view(request): 
    info = json.dumps({'name': 'Some', 'age': 20}) 
    return {'info': info, 'country': 'Ukraine'} 

とあなたがマコ中:デフォルトのピラミッドのセットによって

<script type="text/javascript">func(${info|n})</script> 

hフィルタを使用するMAKOこれはすべてをエスケープします(あなたが見ている問題)。デフォルトのフィルタを編集することはできますが、他のコードに副作用が生じる可能性があるため、通常は最大のアイデアではありません。もう1つの可能性は、有効なjavascriptコードを生成するために、辞書の__str__の実装に依存することです。この場合、何かをシリアル化する必要はありません。少なくとも(この場合は)${info|str,n}を実行するだけで、目的の結果が得られます。

+0

はい、あなたの答えは正しいですが、たぶんjsonにダンプせずに簡単な方法があり、 '| makoでn。私は私のDjangoプロジェクトでmakoを使用するので、makoへの辞書のレンダリングは、jsonなしでmakoで逃げることができます。ありがとう! –

+1

更新された答え、私はdjango-makoの実装を見てきましたが、dictsのために何も特別なこと(ピラミッドはありません)をしません。 django-makoはデフォルトではエスケープを有効にしません。これはユーザからの入力を表示している人(XSSの脆弱性)にとっては危険です。 –

+1

json.dumps({'name': 'Some'、 'age':20})。encode( 'string-escape') '; jsonペイロードに一重引用符を含むテキストがあると、javascriptが破られます。 –

関連する問題