2016/05/16更新

[Python] 軽量WebフレームワークのFlaskに入門(準備、起動、HTML、静的ファイル、GET、POSTなど)

このエントリーをはてなブックマークに追加      

こんにちは、@yoheiMuneです。
今日はPythonのWebフレームワークの1つ、Flaskをブログで書きたいと思います。個人的にも業務でも使っていて、軽量フレームワークでとても簡単に使えます。
画像

目次




Flaskとは

Flaskとは、PythonのWebフレームワークの1つです。Webフレームワークでは他にもdjangoがありますが、それに比べて超軽量なところが特長です。数行でWebアプリケーションが作れて、何かを手軽に作るには便利なフレームワークです。ただ、超軽量で自由が効くので、大きなアプリケーションを作ろうとすると、フォルダ構成やクラス設計などなど、決めることが多いです(自分で決めたいという人は嬉しい話ですが)。



Flaskのインストール

インストールはpip経由で行うことができます。
$ pip install --upgrade Flask



Flaskでハローワールド

それでは早速、FlaskでWebアプリケーションを作ってみましょう。以下のようなコードを書きます。
# app.py
from flask import Flask
app = Flask(__name__)

@app.route("/")
def index():
    return "Hello World!"

if __name__ == "__main__":
    app.run()
このコードは、Webアプリケーションのルート("/")にアクセスしたら、「Hello World!」と返します。
これを起動するには、以下のようなコマンドを実行します。
$ python app.py
 * Running on http://localhost:5000/
そして、Chromeなどのブラウザでアクセスしてみると、「Hello World!」と表示されます。
たったこれだけのことで、Webアプリケーションが立ち上げられるところが、"超軽量"という特徴になっています。



HTMLを返却する

上記のようにただ単にテキストだけを返却するのだとつまらないので、ここではHTMLテンプレートを用いた、HTMLの返却をやって見たいと思います。
まずは、HTMLテンプレートを保存するディレクトリを作成します。
$ mkdir templates
Flaskはデフォルトでtemplatesフォルダをテンプレート置き場として認識してくれます(設定で変更も可能です)。そのテンプレートを呼び出すように、app.pyを変更します。
# app.py
@app.route('/')
def index():
    # 「templates/index.html」のテンプレートを使う
    # 「message」という変数に"Hello"と代入した状態で、テンプレート内で使う
    return render_template('index.html', message="Hello")
そして、index.htmlでは、以下のような実装を行います。
<!-- templates/index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <p>{{ message }}</p>
</body>
</html>
これで、HTMLが返却されるようになりました。



画像とCSSとJavaScriptなどの静的ファイルを扱う

HTMLが返せるようになると、画像やCSSやJavaScriptなどの静的ファイルを扱いたくなります。それらを配置するディレクトリを作成します。
$ mkdir static
templatesと同様に、Flaskがデフォルトでstaticフォルダを静的ファイル置き場と認識します(こちらも設定で変更可能です)。つまりは/static/xxxというリクエストは、ルーティング処理を書かずともFlaskが自動的に処理してくれます。
ここでは、app.jsapp.csslogo.pngを配置してみます。

  • app.py
  • static
    • app.js
    • app.css
    • logo.png
そして、template/index.htmlを以下のように書き直します。
<!-- templates/index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <!-- CSSファイルを追加 -->
    <link rel="stylesheet" href="/static/app.css">
    <!-- JSファイルを追加 -->
    <script type="text/javascript" src="/static/app.js"></script>
</head>
<body>
    <!-- 画像読み込みを追加 -->
    <h1><img src="/static/logo.png"></h1>
    <p>{{ message }}</p>
</body>
</html>
これで、HTMLの機能をフルに使えるようになります。



GETパラメータを扱う

FlaskでGetパラメータを扱うには、以下のようにコードを書きます。
# requestを追加する
from flask import request

@app.route('/hello')
def hello():
    # request.argsにクエリパラメータが含まれている
    val = request.args.get("msg", "Not defined")
    return 'Hello World '  + val    



POSTパラメータを扱う

FlaskでPOST通信を受けつけて、POSTパラメータを取得するには以下のように実装します。
# methodsにPOSTを指定すると、POSTリクエストを受けられる
@app.route('/post_request', methods=['POST'])
def post_request():
    # request.formにPOSTデータがある
    username = request.form["username"]
    return 'Thank you ' + username



URLからアイテムIDなどを取得する

FlaskではRESTであるような、URLに含まれたIDを取得することも簡単にできます。
# パスにIDが含まれていることを指定すると、メソッドの引数で受け取れる
@app.route('/post/<postid>')
def post(postid):
    return 'Thanks post: id = %s' % postid
また、以下のように型を指定することも可能です。
# 型も指定できる
@app.route('/post2/<int:postid>')
def post2(postid):
    return 'Thanks post: id = %d' % postid



参考資料

Flaskの詳細は、Flaskの以下チュートリアルが非常にわかりやすいので(英語ですが)、そちらを参考資料として掲載します。

http://flask.pocoo.org/docs/0.10/quickstart/



最後に

今回は、PythonのFlaskというWebアプリケーションフレームワークについてブログを書きました。個人的にちょこちょことアプリを作る身としては、これくらいライトに(そして必要な機能はある)作れるライブラリは非常に魅力的です(そしてGithubに公開されているコードを読むと、またそれも勉強になります)。今後もFlaskについてはいろいろとブログを書きたいと思います。

最後になりますが本ブログでは、Python・Swift・Java・フロントエンド・機械学習など雑多に情報発信をしていきます。自分の第2の脳にすべく、情報をブログに貯めています。気になった方は、本ブログのRSSTwitterをフォローして頂けると幸いです ^ ^。

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。