プログラマ行進曲第二章

主にソフトウェア関連の技術をネタにした記事を執筆するためのブログ

正規表現を使いこなせない人に捧げる、1.5より前の既存のDjangoアプリのURLテンプレートタグをDjango1.5方式に簡単に移行する方法

結論

django-future-urlという便利なモジュールが公開されているのでそれを使うと幸せになれるのではないでしょうか?

Django1.5に移行しないといけない立場の人は技術力を持っていると思われるので、上記モジュールが大丈夫かどうか自分でソースコード読んで判断できると思います。

以上。

…とここで終わるのもアレなので、少し埋め草として上記モジュールを発見したいきさつを書いてみます。

Django1.5のURLテンプレートタグに対応していないアプリに遭遇

ちょうどDjango1.5がリリースされたのをきっかけにして、Djangoのバージョンを新しくし、どうせならClass Based Viewの書き方を身につけたいなー、なんて思っていたので、Class Based Viewで書かれたアプリを探していたところ、pybbmというClass Based Viewで書かれたフォーラムアプリをdjangopackages.comの中から見つけました。

Djangoの練習として「掲示板アプリみたいなもの(というか2chっぽいもの)を作りたいなー、でもBBSというカテゴリが何か見つからないんだよなー」とか思いながらdjangopackages.comの中を探していたら、どうやら掲示板式のカテゴリはForumsという名前だったようで、これで「よしやった、これでかつる!」と思ったのも束の間。

git cloneして手元で動かそうと思ったら、「Django1.5のURLテンプレートタグの記法になってねーよ!!」というエラーメッセージが出てしまい、ちっとも動かない状態になって泣きそうになりました。

で、自分でスクリプト組んで直すことも考えたのですが、いかんせん私は正規表現方面に弱く、パッと作ることが出来ない状態なので、「誰か1.5に移行する簡単なやり方を公開してないのかなー?」という、人任せ状態に移行。

で、"migrate url tag django 1.5"とか適当にグーグル先生で検索してちょうどいいのないのかなー、なんて思って探していたらdjango-future-urlを発見した、というわけです。

実際に使ってみた雑感

で、「実際そのモジュール、どうなのよ?」という風に思われると思うので、私が使ってみた雑感を箇条書きにして書いてみます。

  • とりあえずpybbmをgit cloneした後、django-future-urlをUsageに書いてあるとおりに従って使ってみた。
  • git diffをザッと見たところ、確かに上手く変換できているようだった。URLテンプレートタグの所にパラメータが書いてあったらそこはクオートの範囲から外すようにちゃんとなっていた。
  • でも人間の目だけだと信頼おけないよ、というのはあると思ったので、用意されていたテストを活かすことにした。95% tests covered codeと自慢しているし。
  • 用意されたテストを活用したら全部テストが通ったのでPull Requestしたら採用されたのでよかったし、多分まともに移行できていたんだろうと判断。
    • マージされた時のdiffはこんな感じ
    • 見たら分かると思いますが、ちゃんと移行できていそうですよね?
    • 余談ですが、用意されていたテストを実行しようとpybbmのドキュメントを読んで試していたら、テストに必要なdjango-registrationがdirect_to_templateを使っていてテストにバリバリひっかかって面倒くさかったということも書いておきます。ちゃんとTemplateViewに移行したPull Request来てるのに。(この記事を執筆している時点でもそのPull Requestに対する反応は無さそうでした)
    • 「テストにはそのPull Requestを送った人のforkを使ってテストしました」とpybbmへのPull Request時に言及したので、そんなに問題は無いかと勝手に思ってます。

まあ、そんなわけで、django-future-urlは非常に有用でしたよ、という話しでした。

こういう風に言っている方もいらっしゃるみたいです。(開発者なのかもしれませんが、ちゃんと調べてません)

私も同意しますね、一回使ってみたので。Djagno1.5に移行しないといけなくて既存のテンプレートを修正する必要のある人は検討してみるのがいいかと思います。

余談

django-future-urlを使うことより、django-registrationの修正遅れのおかげでpybbmのテストをしてPull Requestを送るのが非常に面倒くさかったよ!!!