flaskを使ってみる その6


前回、seabornを使ったグラフ出力を紹介しました。
そこで、今回はこのプログラムをflask対応に変更し、ブラウザーで表示できるようにします。
<変更前のプログラム>
#!/usr/bin/python
#-*- encoding: utf-8 -*-
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import seaborn as sns

def main():
   sns.set(font="serif")
   flip=1
   x = np.linspace(0, 14, 100)
   for i in range(1, 7):
      plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)

   plt.savefig("graph.png")

if __name__ == "__main__":
   main()

<変更後のプログラム>
#!/usr/bin/python
#-*- encoding: utf-8 -*-
import os
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import seaborn as sns
from flask import Flask, render_template
app = Flask(__name__)

@app.route("/")
def main():
   sns.set(font="serif")
   flip=1
   x = np.linspace(0, 14, 100)
   for i in range(1, 7):
      plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)

   plt.savefig("static/graph.png")
   plt.close()

   templateData = {
     'title' : 'flask + seaborn',
     'filename' : 'graph.png'
   }

   return render_template('graph.html', **templateData)

if __name__ == "__main__":
   app.run(host='0.0.0.0', port=80, debug=True)

テンプレートファイル(graph.html)を準備します。
画像がキャッシュされないようにしています。
<graph.html>
<!DOCTYPE html>
   <head>
      <meta http-equiv="Pragma" content="no-cache">
      <meta http-equiv="Cache-Control" content="no-cache">
      <title>seaborn with flask</title>
      <link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='style.css') }}"/>
   </head>

   <body>
      <h1>{{ title }}</h1>
      <img src="{{url_for('static', filename='graph.png')}}" alt="graph.png"/>
   </body>
</html>

変更後のプログラム(sample3.py)を使ってWEBサーバを起動します。


WindowsPCなどでブラウザを起動し、アドレスバーに「http://OPIのIPアドレス」を指定すると
グラフがブラウザ上に表示されます。


このようにPythonで作ったプログラムは、簡単にブラウザー対応に変更することができます。

次回はグラフ表示の応用を紹介します。