質問

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のドキュメントを参照)を介して呼び出すこともできますが、まだ実験していません)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top