Symfoware ODBC接続からChartJSで電子カルテデータをWebにリアルタイム表示するまで 〜院内データ見える化システムの開発〜

基本コンセプト

  1. Fujitsu Symfoware ODBCドライバをPythonで動かしてDWHの情報を取得
  2. 取得したデータをpandasで加工
  3. flask, jinja2でWebページを作成(ChartJSでグラフ描写、Ajaxを使ったリアルタイム更新)
  4. WebサーバとしてIISを使用してWebページ表示
  5. 以上全てを電子カルテネットワーク内でやる

環境

IISマネージャ 設定手順

1. wfastcgi.pyの移設

C:¥Python34¥Scripts¥wfastcgi.pyを所定のFlaskAppフォルダ内に移設する。
例)C:¥inetpub¥wwwroot¥myWebsite¥wfastcgi.py

2. モジュールマップの追加(追加するWebのツリー上で)

要求パス:*
モジュール: FastCgiModule
実行可能ファイル(オプション):“C:¥Program Files¥Anaconda3¥python.exe”|C:¥inetpub¥wwwroot¥myWebsite¥wfastcgi.py
名前: FlaskHandler(任意)
要求の制限…
 マップ
 □(チェックを外す)要求のマップ先が次の場合のみハンドラーを呼び出す
 動詞
  デフォルト
 アクセス
  デフォルト
→OK
(でFastCGIアプリケーションが最上位サーバのツリー上に作成される)

3. FastCGIの設定(最上位サーバのツリー上で)

1で作成されたFastCGIアプリケーションを編集する。(右クリック→編集)
環境変数をクリック
…をクリック
以下2点を追加する
- PYTHONPATH
→C:¥inetpub¥wwwroot¥myWebsite¥
- WSGI_HANDLER
→main.app
※Flaskアプリの名称がmain.pyであればmain.appとなる

4. Application Poolの設定

追加するWebサイトを担当するApplication Poolの設定を開き、IDをAdministratorに変更する

5. C:¥Program Filesのアクセス権限にIIS_IUSRを加える(もしかしたらこれは必要ないかも)

IISスタート!・・・エラーが出ました。。

1.の Fujitus Symfoware ODBCドライバをPythonで動かして・・・のところでいきなりコケました。Symfoware ODBCドライバが32bitであるのに対してPythonが64bitだったためアーキテクチャ不整合のエラーが出てしましました。32bit版Pythonを導入すべきでしたがもう手遅れ、というかここからやり直しをする気が起きませんでした。

じゃあ、どうするか。

仕方がないのでSymfoware ODBC接続をExcelで行うこととしました。Excelの外部接続機能を利用します。そしてPythonのpywin32というライブラリを使ってwin32com.clientというWindowsのモジュールにExcelの外部接続を更新するボタンを毎回押させてデータを最新状態に保ちます。

flaskでは上手くいった、しかしIISでは・・・

win32com.clientはflask単独では動きました。しかしIISに乗せた瞬間に動かなくなりました。

dcomcnfg.exeの設定をいじってみる

win32com.clientの操作権限がIISのDefaultAppPoolに付与されていないためIISからwin32com.clientを動かせない、ということらしいので、DCOM ConfigのMicrosoft Excel Applicationのプロパティからユーザ(DefaultAppPool)を追加してみました。 (IIS AppPool¥[Your Application Pool Identity]を加える。[Your Application Pool Identity]にはそのWebサイトを担当するApplication Pool Identityが入る。(例)DefaultAppPool)

stackoverflow.com

やっぱりダメだった

上記の対応でもIISからwin32com.clientは動かせませんでした。

諦めてflaskとwin32com.clientを切り離す

IIS内に置くflaskのプログラムからwin32com.clientの部分を削除することとしました。こうすることでExcelの更新は出来なくなりますがIISからでもWebページを正常に表示させることができるようになります。win32com.clientの部分はそれ単独でrefresh.pyとしてWindowsのタスクスケジューラで1分ごとにExcelの更新ボタン(RefresAll)を押すように仕込みます。タスクスケジューラの設定方法については後述します。

タスクスケジューラの設定方法

時間間隔について

新規にタスクを設定する場合、タスク実行の最小間隔は1日ということになります。まずはそれで最後まで設定してタスクを生成します。その上で生成されたタスクを右クリックし、トリガーの編集をします。そこで繰り返し間隔を1分間、継続時間を無期限に変更します。1分間が最小単位ということになります。なおタスクの開始設定は毎日ではなく、1日にします。(そうしないと日毎に同一タスクが重複して生成されてしまいます。)

Pythonファイルの設定方法

タスクスケジューラのプログラムの欄にpython.exeファイルを指定し、引数の欄にタスクスケジューラで実行させたいpythonファイルを指定します。
例) プログラム:C:¥Program Files¥Anaconda3¥python.exe
引数:C:¥mytask¥refresh.py
開始の欄には特に何も入れる必要はありません。

おっと、これではタスクが実行されるごとにpython.exeの黒画面が開いてしまいます。これでは他の作業の邪魔になってしまいます。よく調べたらpythonw.exeというものを使えばいちいち黒画面が開かないで済むようです。タスクスケジューラの設定を以下の通り変更します。

プログラム:C:¥Program Files¥Anaconda3¥pythonw.exe
引数:C:¥mytask¥refresh.pyw

Anaconda3の中にpythonw.exeファイルが入っていました。refresh.pyの拡張子を.pywに変更することも忘れずに。

これでいちいち黒画面が開かなくなりました。そうすると逆にちゃんと動いているのか不安になりますが、更新対象のExcelファイルが格納されたフォルダを開いて画面を凝視していると1分ごとに更新時間が最新のものに変更される様子が見て取れると思います。これで安心です。

Geventも加える

flask + IISでも問題ないのですが、Gevent+flaskでスピードが早くなるらしいので加えて見ました。よく分かりませんが、ガンダムのマグネットコーティングみたいなものだと勝手に解釈しました。ちなみにgevent-websocketも導入して見たかったのですが、IE9はWebsocketに対応していないようなのでやめました。

tech.guitarrapc.com

最後になぜChartJSなのか

PythonプログラマーとしてはJavaScriptのライブラリであるChartJSよりもPythonライブラリのBokehを使いたかったのですがBokehのグラフはIE9でうまく表示ができないのです。ChartJSはIE9でも問題なく動きます。ということでJavaScriptの軍門に下った、ということになります。くたばれIE9!