Bottle.pyを0.11から0.12にあげたところ罠にはまったので備忘録。
互換性ェ・・・
0.12系も成熟しただろうと今更に更新かけたら見事に爆死した。
simpleTemplateで1行ifが使えなくなってる
くっそハマって死んだところ。
SimpleTemplateの挙動が非常にマトモになったらしく、それ自体は喜ばしいのだれど、曖昧だったところ定義を厳密にしてくれたらしく、1行if / 1行forが使えなくなっている
if/forには必ず対になるendが必要。
% for item in items:
% if item['hoge']==1: hoge+=1
% end
みたいなことをやっていたのが、全部ダメになった。。。
たしかに
% hoge = len(x for x in items if x['hoge']==1)
で済むとはいえ、ついループの数減らしたくなるじゃん?の結果がこの様。
% for item in items:
% if item['hoge']==1: continue
% end
これとかも多用してたので、直すのがとても手間。
なにが鬱陶しいって、アクセスしに行くとテンプレートの文法エラーで500出るというのが。アクセスしてみないとわからない。。。
あと
% if hoge is None: hoge = "default-hoge"
をどう書き換えるかも悩みどころで
% if hoge is None:
% hoge = "default-hoge"
% end
は冗長だし、かと言って
% hoge = "default-hoge" if hoge is None else hoge
も イマイチ読みづらく、困った。
response.filesの中身が独自クラスに
0.11時代はcgi.FieldStorageだったのに、0.12ではFileUploadという自前クラスに。
http://bottlepy.org/docs/0.11/api.html#bottle.BaseRequest.files
http://bottlepy.org/docs/0.12/api.html#bottle.BaseRequest.files
file
は変わらずFile-like objectなので良いけれど
value
がなくなってらっしゃるので、len(value)で大きさとってたのが死んでた。
新しくcontent_length
が追加されたので、これを信じればいいーのかなぁ?
save
なる謎メソッドが追加されているのは、気持ち悪いのだけれど、もしかしなくとも速かったりするのかもしれない?
なにもSafeじゃないSafe Filename
いまどきにASCIIで255文字までしか受け入れなれないサーバとか滅べ!
上でも触れたresponse.filesの中身
、今までのようにfilename
を呼ぶとありがたいことに去勢されたゴミを返してくれるようになった模様。
BASE64エンコードされるとかそういうのじゃなく、単純に正規表現でASCII以外はばっさりカットされるっていうな。
Safe Filename: The .filename attribute contains a normalized version of the client side file name to ensure maximum file system compatibility (lowercase, no whitespace, no path separators, no unsafe characters, ASCII only).
なにがSafeじゃ。馬鹿か。
日本語ファイル名が拡張子だけになってたぞ
「あいう.txt」
↓ ASCII以外を削除
「.txt」
↓ 不可視ファイルはダメ
「txt」
simpleTemplateのincludeとかその辺
クソコードを悔い改めてくれた
処理系がまともになった模様。
0.11では 0.10までのキーワードから関数に文法変更したのに、パーサがガバガバで新文法が使い物にならなかったのがマシになったっぽい?
よくなったところ
- redirectするとhookが引っかからないとかいう残念バグが解消
- postの引数の数制限が消滅
これだけで更新する価値はあるんだが、だが、移行がこんな辛いとは、、、