today::エンジニアに憧れる非エンジニア

今のところは、エンジニアとは言えないところの職種です。しかしエンジニア的なものの考え方に興味津津。

Pythonあれこれ 2021-02-23 - Flaskにおけるリダイレクト等

概要

「Head First Python 第2版」を進めていった中で考えたことの記録です。

Head First Python 第2版 ―頭とからだで覚えるPythonの基本

Head First Python 第2版 ―頭とからだで覚えるPythonの基本

  • 作者:Paul Barry
  • 発売日: 2018/03/24
  • メディア: 単行本(ソフトカバー)

Flaskにおいてリダイレクトを設定する際のPythonコード

from flask import Flask, render_template, request, redirect
from vsearch import search4letters

app = Flask(__name__)

@app.route('/')
def hello() -> '302':
  return redirect('/entry')


@app.route('/entry')
def entry_page() -> str:
  return render_template(
    'entry.html',
    the_title='Web版のsearch4lettersにようこそ!'
  )


app.run()

上記コードをpyコマンドで実行した上で、http://127.0.0.1:5000にアクセスすると、実行されているWebアプリケーションは以下のようなログを返します。

127.0.0.1 - - [23/Feb/2021 09:53:34] "GET / HTTP/1.1" 302 -
127.0.0.1 - - [23/Feb/2021 09:53:35] "GET /entry HTTP/1.1" 200 -

HTTPステータスコードの300番台はリダイレクトを表します。この例では、Webアプリケーションは以下のような動作をしているわけです。

  1. /GETメソッドでアクセスされると、/entryへのリダイレクトを返す
  2. 1.の動作により、/entryへのGETリクエストが送出される
  3. /entryへのGETリクエストが正常に処理される
  4. Webブラウザentry.htmlの内容が返される

redirect関数のインポート

Flaskにおいてリダイレクトを行わせるには、flaskライブラリに含まれるredirect関数を使用します。当然ながら、redirect関数のインポートという操作が必要になります。以下は、redirectを含むflaskライブラリの関数・クラス群をインポートするimport文の例です。

from flask import Flask, render_template, request, redirect

Flaskにおいて複数のWebページのロケーションに同一関数を割り付ける際のPythonコード

Flaskでは、複数のWebページのロケーションに同一の関数を割り付けることも可能です。下記コードは、「entry_page関数を、//entryという2つのリソースに割り付ける」というPythonコードの例です。

from flask import Flask, render_template, request
from vsearch import search4letters

app = Flask(__name__)


@app.route('/')
@app.route('/entry')
def entry_page() -> str:
  return render_template(
    'entry.html',
    the_title='Web版のsearch4lettersにようこそ!'
  )


app.run()

上記コードをpyコマンドで実行した上で、http://127.0.0.1:5000にアクセスすると、実行されているWebアプリケーションは以下のようなログを返します。

127.0.0.1 - - [23/Feb/2021 09:55:47] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [23/Feb/2021 10:11:17] "GET /entry HTTP/1.1" 200 -

この例では、Webアプリケーションは以下のような動作をしています。

  1. /へのGETリクエストが正常に処理される
  2. Webブラウザentry.htmlの内容が返される

/ではなく/entryに直接アクセスした場合も同様の動作となります。

entry_page関数を、//entryという2つのリソースに割り付ける」という記述は、Pythonコード側における以下の記述が対応しています。

@app.route('/')
@app.route('/entry')
def entry_page() -> str:

単純に@app.routeデコレータをentry_page関数の定義の前に2つ書いているだけですね。このように記述しておけば、あとはFlaskが良い感じに処理してくれます。