質問
MakoテンプレートでPylonsを使用していますが、これを常に入力するのは避けたいです:
${ h.some_function_that_outputs_html() | n }
何らかの方法で関数または変数を安全とマークしたいので(Djangoでできます)、常にパイプで接続する必要はありません。何か案は?
解決
クラスに html メソッドを配置すると、Makoはそのメソッドを呼び出して、テンプレートで返されるものをすべて出力することがわかりました。
だから私はやった:
def __html__(self):
return unicode(self)
それは基本的にh.literalが行うことです。
他のヒント
フィルタリングに関するmakoドキュメントに従って、デフォルトのフィルターを設定できます。 Template
引数とともに、新しいTemplateLookup
およびdefault_filters
を作成するときにテンプレート内で適用されます(この場合、これは検索するすべてのテンプレートにデフォルトで適用されます)。
Pylonsはconfig/environment.py
でこの引数を使用して、h.literal
ファイル内のプロジェクトのデフォルトを設定します:
# Create the Mako TemplateLookup, with the default auto-escaping
config['pylons.app_globals'].mako_lookup = TemplateLookup(
directories=paths['templates'],
error_handler=handle_mako_error,
module_directory=os.path.join(app_conf['cache_dir'], 'templates'),
input_encoding='utf-8', default_filters=['escape'],
imports=['from webhelpers.html import escape'])
これが、デフォルトでエスケープを取得する理由です(自分でMakoを使用する場合はそうではありません)。そのため、設定ファイルでグローバルに変更するか、標準のルックアップに依存しないようにすることができます。もちろん、明示的にフィルターを使用して、エスケープが必要なものをエスケープする必要があることに注意してください。
<!> quot;安全とマークされた文字列<!> quot;を渡すこともできます。 Pylonsヘルパーh.literal('This will <b>not</b> be escaped')
を使用すると、たとえばspam
をテンプレートに渡す場合、たとえば${spam}
という名前の変数として、エスケープせずに<=>を使用できます。
テンプレート内から特定の関数を呼び出したときに同じ効果が必要な場合、この関数はそのようなリテラルを返すか、終了する場合に結果に対して<=>を呼び出す関数のヘルパーを提供する必要があります元の関数のみ。 (または、<!> quot; Filtering def <!> quot;(上記と同じMakoのドキュメントを参照)を介して呼び出すこともできますが、まだ実験していません)