適当おじさんの適当ブログ

技術のことやゲーム開発のことやゲームのことなど自由に雑多に書き連ねます

いまさらながら Flask についてまとめる 〜Routing〜

はじめに

いまさらながら Flask について整理していきます。「Flaskとかいうやつを使って、試しにアプリ開発にトライしてみたい」くらいの感覚の人を対象にしています。

Flaskのバージョンは 0.12.2 です。

この記事では、主にRoutingについて紹介していきます。

Routing?

ルーティングとは、URLと処理を対応づけることです。Flaskのルーティングは、URLとfuncitonを紐付けます。ルーティングには、route() を用います。

from flask import Flask
app = Flask(__name__)

@app.route('/') # http://xxx 以降のURLパスを '/' と指定
def index():
    return 'Index Page'

上記の例では、 http://xxx/ と index() を紐付けています。http://xxx/ にアクセスすると、「Index Page」とだけ書かれた質素なページが表示されます。これがもっともシンプルなルーティングです。

この記事ではそのほか、以下のルーティングについて触れます。

  • HTTPメソッドに応じたルーティング
  • 変数付きのルーティング
  • 静的ファイルのルーティング

HTTPメソッドに応じたルーティング

route() は、HTTPメソッド名のリストを渡してやることで、そのURLが受け入れるHTTPメソッドを指定できます。

@app.route('/edit', methods=['GET', 'POST'])
def edit():
    # 共通の処理
    if request.method == 'get':
        # GET時の処理
    else:
        # POST時の処理
    # 共通の処理

methods に値を指定することで、HTTPメソッドを指定できます。例では、GETとPOSTのリクエストをルーティングしています。

HTTPメソッドの指定を変えることで、同じURLでも異なる関数へとルーティングできます。methods を指定しない場合、GETリクエストのみルーティングされます。

@app.route('/edit', methods=['GET'])
def get_edit():
    # GET時の処理

@app.route('/edit', methods=['POST'])
def post_edit():
    # POST時の処理

処理の内容にもよりますが、私は、HTTPメソッドに対応した関数を定義するほうが好きです。GETとPOSTで異なる処理をすることがほとんどであり、ifで分岐させるよりも、関数を呼び出す時点で分岐しておいた方がスッキリしていると感じます。HTTPメソッドごとに関数を定義する場合は、HTTPメソッドをプレフィックスとした関数名にしておくとわかりやすいです。

変数付きのルーティング

たとえば、User ID=1のデータをリクエストと一緒に送信したいという場合があります。その場合、値をURLの一部として渡す、もしくは、クエリストリングとして渡すのが一般的かと思います。前者のように http://xxx/edit/1 のようにデータを渡したいという場合は、変数付きのルーティングを用います。

@app.route('/edit/<user_id>')
def edit(user_id):
    # user_idを使って処理をする。user_idは文字列として渡される

@app.route('/edit/<int:user_id>')
def edit(user_id):
    # user_idは int として渡される

2つ目のようにconverter を指定することも可能です。converterが指定されていない場合、stringとして扱われます。

また、変数にはデフォルト値を設定できます。ひとつの関数に対して、複数のURLを紐づけることもできます。この2つを組み合わせると、以下のようなルーティングも可能です。

@app.route('/list')
@app.route('/list/<int:page>')
def get_list(page=1):
    # <int:page> が未指定の場合、page=1が設定される

上記の場合、http://xxx/list にアクセスすると、page = 1 になります。

扱う変数の型が明確な場合には、converterを指定しておくと良いです。converterに指定した型と異なる型のデータがURLとして渡された場合、 404 NotFound を返します。上記の例ですと、user_idに aaa などの文字列が渡された場合、 404 Not Found を返します。converterが利用できる場合は、積極的に利用していきましょう。

静的ファイルのルーティング

CSSJavaScript、画像といった静的ファイルのルーティングは自動でされます。

デフォルトでは、 http://xxx/static が static ディレクトリに対応しています。Flaskアプリケーションに static という名前のディレクトリを作成すると自動的にルーティングされます。前述したような route() による定義は必要ありません。

FlaskApp
└── static
    ├── css
    │   └── test.css
    ├── js
    │   └── test.js
    └── test.png

static以下のディレクトリは、ディレクトリ名がパスとしてルーティングされます。上記構成の場合、以下のURLが有効です。

  • http://xxx/static/test.png
  • http://xxx/static/css/test.css
  • http://xxx/static/js/test.js