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(書式指定)