CakePHP使いがDjangoでサイトを作ってみた 〜わずか一行で自動更新ON〜

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
監視中……

この記事を三行にまとめると

fswatchを使ってwsgi.pyが更新されるようにします
設定自体は一行で済むのでそんなに難しくないと思います
チーズ蒸しパンになりたいって思っている方は一度お試しあれ
前にDjangoの中の何かしらのファイルを更新した時に自動的にwsgi.pyを更新する方法ってのを紹介しました。今回はあれの改良版です。

ちなみに前回のはこれね。
CakePHP使いがDjangoでサイトを作ってみた 〜わずか二行で自動更新ON〜



前回のざっくり解説

記事の記事を読むのがめんどい方のために概要をざっくり説明すると、mod_wsgiを使ってApacheでDjangoを動かしている場合、ソースコードを更新したらwsgi.pyというファイルも更新しないとコードの更新が反映されません。でもテスト環境でちょいちょいコードを更新する時に毎回wsgi.pyを手動で更新するのはめんどうだから、ページを読み込むたびにtouchコマンドを実行してwsgi.pyを更新し続けちゃおうっていう感じのことをやっています。

設定自体はコードを二行追加するだけなので楽なんですが、これは何かしらのURLにアクセスするたびにtouchコマンドを実行するので、ソースコードが更新されたかどうかは関係なく常にwsgi.pyを更新するという処理になります。だからページの読み込みが常に遅いというデメリットがある。テスト環境ならまだ良いかもしれませんが本番環境には適用したくないやり方です。

そこで今回は、毎回touchコマンドを読み込まなくても良い方法で、しかも追加するコードは前回の半分(たったの一行)だけでwsgi.pyを自動更新できるようにしてみたいと思います。

ここではMacのターミナルで操作するという前提でお願いします。



fswatchを使う

結論から言うと「fswatch」というファイルの更新を監視してくれるコマンドを使ってDjango内のファイルが更新された時にwsgi.pyが更新されるようにします。

fswatchをインストールする方法はいくつかありますが、Homebrewを使ってインストールするのが手っ取り早いでしょう。

//Homebrewのインストール
$/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

//fswatchのインストール
$ brew install fswatch

Homebrewのインストールコマンドについては公式のウェブサイトにも書いてあるので、それをそのまま実行すればOKです。

Homebrewをインストールするとbrewコマンドが使えるようになるので、それでfswatchをインストールします。



fswatchのインストールが完了したらさっそくコマンドを使ってwsgi.pyを自動で更新できるようにしてみましょう。

fswatch -o /User/akatsuki/django/ | xargs -n1 -I{} touch /Users/akatsuki/django/project/wsgi.py &

これでOKです。ここでは「/User/akatsuki/django」というディレクトリの中にDjangoのプロジェクトがあるという前提で書いています。コマンドの内のパスは任意に書き換えてください。

内容としては監視したいディレクトリ(/User/akatsuki/django/)のパスを指定し、このディレクトリの中のいずれかのファイルが更新されたらtouchコマンドでwsgi.pyを実行するという設定を行っています。バックグラウンドで実行してほしいので最後に「&」をつけています。これをつけないとfswatchを有効にしている間はターミナルで他の作業ができなくなっちゃう。

「-n1」とか「-I{}」というのは、えーと何だろう……? まあとりあえずこれで目的の動きになるってことだ。

詳細については以下のドキュメントを読んでくだせえ。英語だけど。

https://github.com/emcrisostomo/fswatch#usage

Djangoに限らずこのfswatchコマンドを使えば特定のファイルが更新されたタイミングで何かしらの処理を発動させることができるので、使い道はいろいろありそうです。






fswatchのインストールさえスムーズに行けば設定自体は一行で済むのでそんなに難しくないと思います。

前回と違ってファイルが今回は更新された時のみtouchコマンドが実行されるので、常にtouchコマンドが実行されることによるページの読み込み速度の低下を回避できます。だから前回のやり方よりもこっちの方がいろんな意味でオススメです。もちろん更新された直後は読み込みが遅くなるけど。

「wsgi.pyを手動で更新すんのめんどくせえ。チーズ蒸しパンになりたい」って思っている方は一度お試しあれ。
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください