BLOGサブスレッドの日常

2018.12.30

コマンドラインから処理を実行しよう

tama

暮れましておめでとうございます。tamaです。

Webサービスやサイトを作っていると、ログや諸々の実績を集計したり、
それをエクスポート(Excelやcsv、PDFでダウンロード)したり、
データをまとめてインポートしたりってことがあると思います。
ある前提で話してます。
ない人にはこの記事は役に立ちません。

設計の話なんですけど、そういう集計やインポート・エクスポートの処理は、
たとえ入口がWebインタフェースだとしても、
本質的にHTTPとは無関係な処理になっているはずです。
だったらそれはWeb(HTTP)とは独立した処理として実装されるべきですよね。
Djangoで言うと、HttpRequestオブジェクトや HttpResponseオブジェクトに
依存しない処理として実装されるはずです。実装されるべきです。

そうするとこれらの集計処理・インポート処理・エクスポート処理は、
コマンドラインからも問題なく呼び出せるはずです。
django-admin commands です。

Webインタフェースで指定するパラメタやアップロードするファイルは全てコマンドライン引数で指定します。
例えば「2018年10月1日から2018年12月31日までのアクセスログ集計のエクスポート」であれば

manage.py export_accesslog --from 2018-10-01 --to 2018-12-31 --output accesslog.xlsx

のような具合です。

これをするメリットは、開発中の動作確認がとても楽になります。
※効果には個人差があります。
Webインタフェースでドロップダウンボックスとかを使って範囲指定したり何かしらしなくても、
シェルのヒストリから何度でも同じコマンドを実行できます。
ファイルダウンロードとかファイル名が変わるとか考えなくても、同名ファイルで上書きできます。
エラーしたときもブラウザにエラーを表示するのでなく、コマンドラインにtrackbackが表示されます。
意図しない動きをしているときはprintデバッグをすることもできます。
Webインタフェースよりコマンドラインインタフェースは何かと便利なのです。

そしてもうひとつ。
何らかのトラブルがあってWebインタフェースが使えないときにもコマンドラインから処理を実行できます。
具体的には集計処理を走らせたり、ファイルのインポートやエクスポートができます。
(本質的には原因を解決しないといけないものの)処理に時間がかかりすぎてWebインタフェースがタイムアウトしてしまうようなときにも
コマンドラインから処理を実行することができます。

だからなんだって話なんだけど、手間を惜しまずちょろっとコマンドライン対応をしておくと
開発も楽になるし運用開始後もイザというとき使えるよというお話。
社内イントラのとあるエクスポート処理は(使うのがあたし一人なので)Webインタフェースがまだ作ってなくて、
コマンドラインでのみ実行できるので必要時サーバにsshしてエクスポートしてます :p

この記事を書いた人

tama