Djangoのテンプレートビュー ( TemplateViewクラス) を使って、HTMLテンプレートをそのまま出力したいけど、 その出力結果の文字列を一括置換したい方法2案です。
middleware は使わず、urls.py で処理します。
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
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 を操作しようとすると例外が出ます。