[python3]HTMLテンプレートとしてformatメソッドを使用するコツ

pythonでCGIプログラムを書くと、str型(文字列型)の変数にテンプレートとなるHTMLを代入して可変のところだけ文字列フォーマット化してしまうことが多いが、python3から本格導入されたformatメソッドでは書式指定部分が「%」から「{}」に囲まれてた部分に変更されているので、HTML中のCSSやJavaScirptと非常に相性が悪い。({ }の間で改行してもKeyとして認識されてしまう)
「%」のときと同様に同じ文字を重ねたらエスケープできるが(「{」→「{{」)、これをHTMLテンプレートの中で全部すると非常にめんどくさいし可読性も悪くなる。
なので、人がコードを記載するときのクセの違いを利用して、後から「{」を「{{」に置換してしまおうという作戦。
大抵の人が以下のようなクセになると思う。(完全に私感)
pythonのformatによる書式指定({}の間はスペースを空けない)

 '<html><body>{body}</body></html>'.format(body="今日は晴天なり")

CSS/Javascript(可読性をあげるために{}の間に改行やスペースが入る)

 <html>
  <head>
    <style type="text/css">
        <!--
            dt{ backgroud: #bbb }
            .odd{ backgroud: #ddd }
        -->
    </style>
    <script type="text/javascript">
       function hogehoge() {
          print("本日は晴天なり");
       }
     </script>
</head>

これを踏まえて以下のようにすれば、HTMLテンプレート部分は毎度エスケープしなくてもよくなる。({}を重ねる置換を実施してからformatをしている)

import re
htmltemplate='''
 HTMLのテンプレート
'''
html=re.sub(r'([^a-zA-Z0-9])}',r'\1}}',re.sub(r'{([^a-zA-Z0-9])',r'{{\1',htmltemplate,0,re.M|re.S),0,re.M|re.S).format(書式指定)

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です