私はMakoテンプレートでPylonsを使用していますが、これを常に入力することは避けたいと思います。
${ h.some_function_that_outputs_html() | n }
どういうわけか、関数または変数を安全としてマークしたいので(Djangoでそれを行うことができます)、常にパイプを使用する必要はありません。何か案は?
クラスにhtmlメソッドを入れると、Makoはそのメソッドを呼び出して、テンプレートに返されるものをすべて出力することがわかりました。
だから私はしました:
def __html__(self):
return unicode(self)
それは基本的にh.literalが行うことです。
mako docs about filteringによると、新しいものを作成するときにテンプレート内に適用されるデフォルトのフィルターを設定できますTemplate
(TemplateLookup
この場合、これは検索するすべてのテンプレートにデフォルトで適用されます)default_filters
。 .
Pylons はこの引数を使用して、ファイルTemplateLookup
内のプロジェクトのデフォルトを設定しconfig/environment.py
ます:
# 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 を自分で使用する場合には当てはまりません)。したがって、構成ファイルでグローバルに変更するか、標準のルックアップに依存しないことができます。もちろん、エスケープが必要なものをエスケープするためにフィルターを明示的に使用する必要があることに注意してください。
Pylons helper で「安全とマークされた」文字列を渡すこともできます。たとえば、テンプレートにh.literal
渡す場合、たとえばという名前の変数として、エスケープせずにそのまま使用できます。h.literal('This will <b>not</b> be escaped')
spam
${spam}
テンプレート内から特定の関数を呼び出したときに同じ効果が必要な場合、この関数はそのようなリテラルを返すかh.literal
、元の関数をそのままにしたい場合は結果を呼び出すその関数のヘルパーを提供する必要があります。(または、「フィルタリング定義」(上記と同じ Mako doc を参照)を介して呼び出すこともできると思いますが、まだ実験していません)