ITや趣味など気軽に投稿しています。

【Python】FlaskでWebアプリケーションを作る① -Webサーバを起動する

今回からPythonでWebアプリケーションを作ってみる。Flaskを知っているかいテック君。

聞いたことないですね。Flaskを使えばPythonでWebアプリケーションが作れるんですか?

質問をオウム返しするな。期待した私が悪かった。

ハッ。。(厳しい)

仕方ない。まずはFlaskとは何ぞというところを説明しよう。

Flaskとは

FlaskとはPythonで実装されたWSGIのWebアプリケーションフレームワークです。

WSGIとはWeb Server Gateway Interfaceのことで、WebサーバとWebアプリケーションに接続するための標準化されたインターフェース定義のことです。WSGIを利用することでWebサーバとWebアプリケーションの実装を切り離すことができ、これによってWebサーバとWebアプリケーションフレームワークの組み合わせの選択肢が広がりました。

Flaskは軽量はフレームワークで、素早く手軽に実装できる点が特徴です。しかしながら、場合によっては複雑で高度なWebアプリケーションへとスケールアップすることも可能です。

WerkzeugとJinjaのラッパーとして始まったFlaskですが、現在ではPythonのWebアプリケーションフレームワークとしてdjangoと並ぶ人気を誇っています。

WSGI?なんか難しそうですね、、

そのあたりは深く考えなくてもよい。我々ユーザがあれこれ考えなくても実装できるように作られた標準と思ってくれたまえ。

準備

Flaskを利用するためには、事前にFlaskパッケージをインストールしておく必要がある。

pipで環境にインストールすればいいんですね。

その通り。Anacondaを利用している場合はcondaコマンドを使ってインストールすることになる。

#pipの場合
pip install flask

#Anacondaの場合
conda install flask

Webアプリケーションの起動

FlaskでWebアプリケーションを作成してみよう。以下に示すのは、最もシンプルなWebアプリケーションである。

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"

if __name__ == "__main__":
    app.run()


>>以下、実行すると出力される
 * Serving Flask app "Hello_World" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

たったこれだけですか!?

うむ。これだけでWebアプリケーションが立ち上がった。
試しにhttp://127.0.0.1:5000/にアクセスしてみよう。

http://127.0.0.1:5000

Hello Worldが表示されてますが、これだけですか?
なんかイケてないなぁ。

君の考えるイケてるはよくわからんが、とりあえずWebアプリケーションとしてHello Worldというコンテンツは配信されている。

普段見ているWebサイトなどは、ここからコンテンツを増やし、スタイルシートなどを使って見た目や機能を作っているのだ。

イケてるWebサイトは1日にして成らず。ですね。

とにかく、コードの内容を簡単に説明しよう。

処理内容

モジュールのインポート

Flaskクラスをインポートします。

from flask import Flask

インスタンス作成

Flaskクラスのインスタンスを作成します。FlaskオブジェクトにはWebアプリケーションに必要な機能が詰まっています。このとき第一引数にはアプリケーションのモジュール名(.pyのPythonファイル名)またはパッケージ名(モジュールを集めて格納したディレクトリ名)を渡します。

app = Flask(__name__)

appというのがいわばWebアプリケーション本体のようなものだ。

なるほど!では以降appに対していろいろな処理を行っていくのですね。

ちなみに__name__はPythonの特殊な変数で、コマンドプロンプトやIDEでそのプログラムファイルを直接実行した場合には”__main__”が、他のスクリプトから呼び出された場合には自身のモジュール名(ファイル名)が格納される。

__name__を渡す目的だが、FlaskではHTMLやJavaScriptのファイルを格納するフォルダ構造が決まっている。
それらの場所を把握するために、どのスクリプトでWebアプリケーションのコアとなるFlaskオブジェクトが作成されたという情報が必要なのだ。

…zzz

… テック君にはまだ早かったか。

ルーティング

ルーティング処理を記載します。ルーティングによって、リクエストされたURLとそれが引き金となって実行される処理をリンクさせます。

@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"

ルーティングをもう少し具体的に教えてほしいです。

例えば今回の場合、クライアントから”Hello World”と表示する画面を出してくれ!とサーバにリクエストを送っている。Webサーバをそのリクエストを受け取り、お望み通りのWebページをクライアントに返す。そのときの紐づけをルーティングという。

なるほど、実際はもっと色々なページがあるから、紐づけが必要なんですね。

珍しく勘が鋭いな。
今回は1つのみだが、実際はこの部分が必要な処理の数だけ必要となる。

Webアプリケーション起動

app.run()によってアプリケーションを起動します。開発用サーバで起動する場合のみですが、debug=Trueとすることによってリクエスト処理中に起きたエラー内容をブラウザに表示させることもできます。

if __name__ == "__main__":
    app.run()

appをrunする、つまりWebアプリケーションを開始(実行)しているのがこの部分だ。

なのでメイン処理なんですね。

まとめ

以上がFlaskでWebアプリケーションを作成するときの基本となる。
実際は画面をHTMLで用意したり、CSSやJavascriptも組合わせて動きや見た目もカスタマイズして公開するケースがほとんどだが、今回の部分は不変なのだよ。

Webアプリケーションの土台ってことですね。

その通り。Flaskについては次回以降さらに深堀って行こうと思うが、今回はここまで。

ありがとうございました~~♪