まず、お気楽にプログラム中に
print('===============') print('process complete') print('===============')
みたいな行を挟みまくって標準出力に表示させていたわけだが、
これだとプログラムを走らせているウインドウをずっと見ておかないとならないわけで、不便だな、と。
で、Pythonにはloggingというモジュールがあるということを知ったので、早速組み込んでみる。
https://docs.python.jp/3/howto/logging.html
公式のドキュメントを見ただけで、簡単に使えそうなのでやってみる。
from flask import logging logging.basicConfig(filename='maintenance.log',level=logging.INFO, format='%(asctime)s %(levelname)s:%(message)s') logging.debug('sub-process comp') logging.info('process complete')
こんな感じで書いておくと、コンフィグでINFOとしているのでdebugは表示されず
process complete
だけがログファイル(maintenance.log)に書き込まれていく。
また、普通に標準出力に打ち出されていたwarning等もこちらに書き込まれていくようだ。
今回、データベース管理画面に仕込んだわけだけど、そのページの情報だけじゃないのね。
普通に検索画面で検索した履歴なども同じログに書き出されるようだ。
次に出来上がったログファイルをwebブラウザから参照したい。これはファイルアップロードのところで、試験的に入れていた
send_from_directory
をつかって表示させることにする。
exome_su.py
@app.route('/exome_log/') @login_required def exome_log(): return send_from_directory('../', 'maintenance.log')
たったこれだけ。
これでアプリケーションルートに書き出されているmaintenance.logをapp/内のスクリプトから呼び出してwebに書き出してくれる。
templateの方で
<a href="{{ url_for('exome_su.exome_log') }}" target="_blank"> <div class="btn btn-default">log file</div>
とリンクを用意しておけば、新しいウインドウを開いてログを表示させておける。less +Fのようにリアルタイムで表示を更新してもらえるともっと良いのだけれど、流石にその機能はないので時々リロードして進み具合を確認するしかない。
最後にログに書き出したlogging.infoのメッセージを画面上にも表示させたいならどうするか、という答えはflask.flashの利用だろうか。
from flask import flash flash('Update complete: %s' % form.sample.data)
使い方はprintとほとんど変わらない。
template側に受けが必要なんだけど、実はbase.htmlに元から用意されている。
{% block page_foot %} {% for message in get_flashed_messages() %} <div class="alert alert-warning"> <button type="button" class="close" data-dismiss="alert">×</button> {{ message }} </div> {% endfor %} {% endblock %}
この部分に受け渡される。
最初このbase.htmlを参照する側のtemplateの{% block page_foot %}{% endblock %}がbase.htmlのその部分を上書きしちゃってて表示されない、としばらく悩んだ。