2

Makoテンプレートを使用してWebページを作成しています。

|を使用してhtmlがエスケープしないようにするセクションがあります。n。ただし、内部では、アプリのビュー側でHTMLをエスケープする必要があるユーザー生成エントリもいくつか表示する必要があります。

このためにPyramidを使用する方法は何ですか?

CGIのエスケープがあることは知っていますが、Makoのものほど良くはないようです。それを使用したいと思います。

現在私は持っています:

from pyramid.compat import escape

escape(str)

ありがとうございました!

4

4 に答える 4

3

ピラミッドドキュメントによると、(Python 3で)をpyramid.compat.escape提供します。cgi.escapehtml.escape

mako docsによると、エスケープ機能はによって提供されmarkupsafe.escape(x)ます。MarkupSafeは、__html__エスケープしているオブジェクトのメソッドを探し、見つかった場合はそのメソッドを呼び出し、その結果をエスケープされた文字列として使用することを覚えておいてください。これにより、特定のアイテムをエスケープする方法にある程度の柔軟性が得られる場合があります。

これらのいずれかを使用するか、(可能であれば)別のオプションを使用してテンプレートを変更し、ビューではなくテンプレートでエスケープが実際に行われるようにすることができます。

于 2012-06-22T14:58:51.533 に答える
3

同様の問題を解決しようとしていたので、ここに2セントを投入すると思いました。私の場合、私はPythonとPyramidに非常に慣れておらず、(非常に)単純なブログを作成するために単一ファイルタスクチュートリアルを変更しています。

私の投稿コンテンツはsqliteデータベースに文字列として保存されました。問題は、コンテンツ文字列がテンプレートに出力されたときに、htmlタグがプレーンテキストとして表示されていたことでした。

ではなく:

ここに画像の説明を入力してください

私が得ていた:

ここに画像の説明を入力してください

| nフィルタを追加すると、問題が解決しました。HTMLコンテンツが投稿本文に正しく表示されるようになりました。

投稿リストの私のテンプレート(.mako):

# -*- coding: utf-8 -*- 
<%inherit file="layout.mako"/>

<ul id="posts">
% if posts:
  % for post in reversed(posts):
  <li>
    <span class="name">${post['name']}</span> 
    <span class="content">${post['content'] | n}</span>
  </li>
  % endfor
% else:
  <li>Sorry, no posts...</li>
% endif
</ul>

およびview_config:

@view_config(route_name='list', renderer='list.mako')
def list_view(request):
    rs = request.db.execute("select id, name, content from posts")
    posts = [dict(id=row[0], name=row[1], content=row[2]) for row in rs.fetchall()]
    return {'posts': posts}

この答えは私を助けました。

これが誰かに役立つことを願っています。

于 2012-09-07T21:47:55.543 に答える
2

webhelpersパッケージは、役立つ可能性のあるエスケープ関数を提供します。ドキュメントから:

webhelpers.html.builder

HTMLビルダーは以下を提供します:

Pythonの方法で(X)HTMLタグを作成するHTMLオブジェクト。

意図的なHTMLマークアップを含む文字列をマークするために使用されるリテラルクラス。

リテラルを保持するが、誤ってマークアップ文字(“&lt;”、“&gt;”、“&amp;”、'”'、“'”)または悪意のあるJavascriptタグを含む可能性のある他の文字列をエスケープするスマートescape()関数。エスケープされた文字列は、後で二重エスケープされないようにリテラルとして返されます。

于 2012-06-22T15:47:51.773 に答える
0

一部の限定されたマークアップと一部のHTMLにマークダウン(およびJavascriptではページダウン)を使用して、ユーザーが入力をカスタマイズできるようにします。

カスタムユーザーマークアップを保存または表示する前に、次のコマンドでHTMLをクリーンアップします。

from html5lib import sanitizer
from html5lib import html5parser, serializer, treebuilders, treewalkers

# This sanitizer translates all the troublesome tokens
def sanitize2(text):
    if (text is None) or isinstance( text, ( int, long ) ):
        return text
    sanobj                      = sanitizer.HTMLSanitizer
    sanobj.strip_tokens         = True
    sanobj.lowercaseElementName = True
    sanobj.lowercaseAttrName    = True
    hparser                     = html5parser.HTMLParser(tree = treebuilders.getTreeBuilder('dom'), tokenizer=sanobj)
    dommodel                    = hparser.parse(text)
    serobj                      = serializer.htmlserializer.HTMLSerializer(sanitize = False)
    outstr                      = ''.join(serobj.serialize(treewalkers.getTreeWalker('dom')(dommodel)))
    return outstr

次に、実際に表示するカスタムピラミッドフィルターがあります。

import markdown

def jmarkdown(text):
    return markdown.markdown(text)

これにより、「| jmarkdown」が機能します!

于 2014-05-21T20:11:05.730 に答える