Djangoのテンプレートビュー (TemplateView)で文字列置換する方法

(コメント)

Djangoのテンプレートビュー ( TemplateViewクラス) を使って、HTMLテンプレートをそのまま出力したいけど、 その出力結果の文字列を一括置換したい方法2案です。

middleware は使わず、urls.py で処理します。

案1 as_view の結果をデコレーションする

urls.py

url(r'^hoge-page/$',
     TemplateView.as_view(
         template_name="hoge-page"),
     name='hoge-page'),

▲これを

url(r'^hoge-page/$',
     content_replace_decorator(TemplateView.as_view(
         template_name="hoge-page")),
     name='hoge-page'),

▲こういった形に変更して使う、出力結果内の文字列置換を行うデコレータを考えます。

def content_replace_decorator(func):

    @functools.wraps(func)
    def wrapper(view, *args, **kwargs):
        result = func(view, *args, **kwargs)

        def callback(response):
            response.content = response.content.replace(
                FROM_WORD.encode('utf-8'),
                TO_WORD.encode('utf-8'))

        if isinstance(result, HttpResponse):
            result.add_post_render_callback(callback)
        return result

    return wrapper

案2 TemplateView を継承したクラスを作る

url(r'^hoge-page/$',
     TemplateView.as_view(
         template_name="hoge-page"),
     name='hoge-page'),

▲これを

url(r'^hoge-page/$',
     ContentReplaceTemplateView.as_view(
         template_name="hoge-page"),
     name='hoge-page'),

▲こう変えて、出力結果の文字列置換を行うクラスを考えます。

class ContentReplaceTemplateView(TemplateView):
    @staticmethod
    def callback(response):
        response.content = response.content.replace(
            FROM_WORD.encode('utf-8'),
            TO_WORD.encode('utf-8'))

    def get(self, request, *args, **kwargs):
        result = super(ContentReplaceTemplateView, self).get(
            request, *args, **kwargs)
        result.add_post_render_callback(self.callback)
        return result

いずれにせよポイントとしては、HttpResponse のインスタンスの add_post_render_callback に変換メソッドを入れます。

こうしないで直接 HttpResponse インスタンスの content を操作しようとすると例外が出ます。

現在未評価

コメント

最近のツイート

  • 小泉しゅうすけ@寒川町議会議員

    小泉しゅうすけ@寒川町議会議員 @KoizumiSamukawa

    ytyng

    漫画歴代発行部数ランキングとか見ると、上位はことごとく犯罪行為が平気で描かれている作品ばかりです。で、これらの漫画を読んで犯罪を起こした人はどの程度居るのでしょうか…ゴルゴ13を読んでスナイパーになった人は果たして存在するのかどう… https://t.co/ndFS6wezxQ
    1 週間, 6 日 前

  • ytyng

    ytyng @ytyng

    MacBookのロゴを隠してるとプロっぽい。小並感だけど。 https://t.co/SRe5T68hHR
    2 週間 前

  • ytyng

    ytyng @ytyng

    初めてnpmにパッケージ上げた
    2 週間, 4 日 前