はじめてのpython軽量Webフレームワーク【Flask】の使い方
pythonでWebアプリケーションやWebサービスを作成する場合に使えるフレームワークを探していたところ、djangoなどが有名でしたが、いろいろとできる反面、学習コストが高そうだったので、もう少し簡単に実装できるものは無いかなーと思ってました。
そこで見つけたのが、Flask。軽量のWebアプリケーション・フレームワークです。
Falskでできること
軽量なので、シンプルなWebアプリやサービスは簡単が作れます。
テンプレート・エンジンも内蔵しているので、ページのテンプレートに変数を埋め込んで描画するなんてことも出来ますし、json形式のレスポンスを返すWebサービスもサクッとできました。
例えば社内や自分の仕事効率化のためのWebサービスやBotなどは、そこまで大量のリクエストをさばくわけではないので、Flaskなどで十分なのではないかと思います。
Flaskのセットアップ
どれくらいお手軽なのかは、実際にFlaskを使える環境を整えてみればわかります。30分程度で、簡単なWebアプリを作成できます。早速やってみましょう。
virtualenvを使うと、依存ライブラリの管理がシンプルになりますので、この記事「複数バージョンのPython2系と3系をvenv(virtualenv)で切り替えて使用する環境構築まとめ(windows編)」を参考に設定しておくことをお勧めします。
なお、python3を使った方が日本語の文字化けなど、マルチバイト文字の設定に悩まなくてすむので、おススメです。
さて、venvの設定がされているなら、以下のコマンドで新しくflaskのWebアプリ用のvenv仮想環境を作ります。
#新しく「my_flask」という名前で仮想環境を作成 py -3 -m venv my_flask #仮想環境をactivate my_flask\Scripts\activate.bat
「my_flask」が今回作成した仮想環境です。
仮想環境ができたら、「pip」でFlaskをインストールしましょう。
pip install Flask
これで環境設定は終わり。次に行きましょう。
Flaskを使ってみる
まずはお決まりのHelloWorldを表示する簡単なWebアプリを作ってみましょう。
「my_app.py」という名前で以下のようなソースを記述します。
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return 'Hello world!' if __name__ == '__main__': app.run(debug=True)
ファイルの保存が終わったら、コマンドプロンプトから以下のように起動することが出来ます。
サーバはデフォルトで5000番ポートで待ち受けます。
(my_flask) D:\MyDownload\python\envs\my_flask>python myapp.py
* Restarting with stat
* Debugger is active!
* Debugger PIN: 278-211-390
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
上記ソースを簡単に解説すると、
from flask import Flask
最初にflaskクラスをインポートします。
app = Flask(__name__)
次に、Flaskクラスをインスタンス化します。
引数は、モジュールが1つだけであれば「__name__」を使用します。
Flaskではより複雑なWebアプリを構築するためにモジュールとアプリケーションという仕組みがあります。今回はシンプルなので、モジュール形式となります。
@app.route('/') def index():
次に、route()デコレーターを使用して、どのURLの時に、どの関数が呼ばれるのかの定義を行います。
サーバを止めるときは「control-C」を使いましょう。
また、外部からアクセスする場合は、「app.run(host=’0.0.0.0′)」を使ってIPアドレスをバインドするとOkです。
リクエストの処理
では、リクエストの処理の仕方を見てみましょう。Webアプリでは必須の機能ですよね。
Flaskは、デフォルトではGETメソッドを受け付けるようになっています。
最初に記述したmyapp.pyに以下の記述を追加します。
from flask import request @app.route('/search') def search(): searchword = request.args.get('key', '') return 'searchword=' + searchword
getのパラメータをrequest.args.get(‘key’, ”)でとっているところがミソです。
POSTの場合は、以下のようにリクエストを受け付けます。
@app.route('/login', methods=['POST']) def login(): userid = request.form["userid"] return 'userid=' + userid
postパラメータはrequest.form[“userid”]で取得していますね。
テンプレートを使ってページを描画する
ページを動的に生成するのは結構大変なので、Flaskは自動で「Jinja2」というテンプレートエンジンを呼び出して使ってくれるようになっています。
また、Flaskは、templatesというフォルダの中を探してくれるので、
/myapp.py /templates /hello.html
のような構成でテンプレートファイルを配置しておくと、自動で検索して読み込んでくれます。では、templatesフォルダにhello.htmlという名前で、以下のような内容のファイルを作ります。

次に、myapp.pyに以下の記述を追加します。
#render_templateを追加する。 from flask import render_template @app.route('/hello') def hello(): username = request.args.get('username', '') return render_template('hello.html', name=username)
render_templateという関数を、テンプレートのファイル名と、そのテンプレートの中で使用する変数の値を渡して使用していることに注意しましょう。
http://127.0.0.1:5000/hello?username=%E3%81%9F%E3%81%BE%E3%81%94
みたいにブラウザでアクセスすると、テンプレートの描画結果が表示されます。
各種設定の仕方
Flaskには、configを設定する仕組みがあります。
最初のサンプルで「app.run(debug=True)」のように渡しているところですが、
app = Flask(__name__) app.config['DEBUG'] = True
のように渡すことも可能です。
※configに渡すのはキーなので、大文字ですが、debug=Trueでセットしているのはプロパティなので小文字になります。
jsonレスポンスを返す
Flaskで簡単なWebサービスをサクッと作る場合、レスポンスの形式をjsonにしたいことがあります。
さすがは軽量WebフレームワークのFlask、結構簡単にできるので、そのやり方をメモしておきます。
from flask import jsonify #jsonifyを追加する @app.route('/json_res') def json_res(): username = request.args.get('username', '') return jsonify(username=username, email='aaa@bbb.com', nickname='ぱーくん')
