logo logo

June 14, 2019 04:30

Python製軽量フレームワークFlaskのTutorial実験メモ

内容

  • Python製のマイクロWEBアプリケーションフレームワークであるFlaskの公式マニュアルの冒頭を読んだので、勘所だけさくっとメモる
  • それほどリッチでないアプリケーションをさくっと作るのにむいている

QuickStart

Install

各種モジュールとの依存関係がきついので、専用環境を作るのは必須と思ったほうがよいみたい。
適当な作業フォルダを用意したら

$ python3 -m venv venv

で仮想環境を用意。-m の意味は公式を参照。

$ . venv/bin/activate

で仮想環境に入ったあとでFlaskをインストール。(作業時点でのバージョンは1.0.2)

$ pip install Flask

Hello, World!

hello.pyを作り、以下の内容を入力するだけで、ブラウザにhello, worldを出力するアプリができる。

hello.py


from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

@はデコレータと呼ばれるもので直後に書いたメソッドを、該当のメソッドで修飾するPythonの機能。

アプリケーションサーバーの起動は以下のように行う。
1行目は内部で使ってる環境変数の定義。2行目を実行すると開発環境モードになり、各種デバックツールが使えるようになる。

$ export FLASK_APP=hello.py
(optional)$ export FLASK_ENV=development
$ flask run

localhost:5000にアクセスするとhello, worldが表示される。

Routing

基本的にはappクラスのrouteメソッドで自作のメソッドを修飾する形でURLとコントローラを対応づける。

@app.route('/')
def index():
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello, World'

ルーティングしたいURLに変数を使う場合には次のようにやるらしい。

@app.route('/user/<username>')
def show_user_profile(username):
    # show the user profile for that user
    return 'User %s' % username

@app.route('/post/<int:post_id>')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id

@app.route('/path/<path:subpath>')
def show_subpath(subpath):
    # show the subpath after /path/
    return 'Subpath %s' % subpath
  • string : '/'以外!
  • int : 正の整数
  • float : なんと浮動小数点型も使える!?
  • path : '/'も使えるstring
  • uuid : 一意のID

HTTP methods

routeメソッドに引数を与えて該当HTTPメソッドを受容できるようにしておき、コントローラ内部で条件分岐するだけ。個人的にはrailsよりも明快で気に入った

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return do_the_login()
    else:
        return show_the_login_form()

テンプレート表示

コントローラが対応するビューテンプレートを表示させるようにする

from flask import render_template

@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
    return render_template('hello.html', name=name)

フォルダ構造はつぎのようにしておく

/application.py
/templates
    /hello.html

or

/application
    /__init__.py
    /templates
        /hello.html

Jinja2というテンプレートエンジンを使うらしく、書き方はこんな感じ

<!doctype html>
<title>Hello from Flask</title>
{% if name %}
  <h1>Hello {{ name }}!</h1>
{% else %}
  <h1>Hello, World!</h1>
{% endif %}

その他

  • とりあえず導入して触ってみた
  • CookieやらSessionも簡単に使えそうだけど、それ以上踏み込むなら必要に応じて公式を参照したほうが良さそうなのでここまで