ゆるゆると進めております。本日は、「リダイレクションのルール」と「url_for」というものを学びました。
一つづつ勉強していきましょう〜
FlaskでWebアプリを開発するための勉強をしております。今回は、Flaskチュートリアルの「QuickStart」の「Unique URLs」の項目から勉強をしていきます。
こんな人の役に立つかも
・Flaskを勉強したい人
・PythonでWebアプリケーション作成をしたい人
ユニークなURL、リダイレクションの挙動
ここのチュートリアルで出てくる用語をおさらいします。
カノニカル
重複したURLがある場合、検索エンジンの評価が分散します。例えば、「https://panda-clip.com」と「https://www.panda-clip.com」は同じ内容を表示します。これは、重複していますので、URLを「正規化」してどちらかの表記に統一する必要があります。このような場合、canonicalというタグを埋め込むことでどちらが正規のURLを指定することができますが、チュートリアルでは、重複しているURLというような意味に取られられました。
そしてURLの重複には色々なパターンが考えられます。
・httpとhttpsの違い
・wwwのありとなし
・URLの末尾のスラッシュがあるかないか
など・・・重複する場合のパターンがいくつか存在しています。このチュートリアルでの重複したURLの対応については、「URLの末尾のスラッシュがあるかないか」について言っているようです。
それでは、FlaskのURL(エンドポイント)にスラッシュがあるか、ないかでどのような挙動をするかをサンプルのプログラムでやってみます。
@app.route('/projects/')
def projects():
return 'The project page'
@app.route('/about')
def about():
return 'The about page'
プログラムは、以前まで作成した「hello.py」の一番下にくっつけましたよ。
プログラムの検証
プログラムを保存したら、URLを打ち込んで検証してみます。
ブラウザで「localhost:5000/projects」にアクセスしてみます。projectsのスラッシュなしで打ち込んでみます。
本当は、「/projects/」のスラッシュが必要なURLです。
自動的に、「/projects/」のエンドポイントへとリダイレクトされました。
次に、「localhost:5000/about/」と入力してアクセスしてみます。プログラムでは「/about」と末尾にスラッシュがないエンドポイントを定義したものです。これに対してスラッシュありにアクセスしてみます。
「/about」のように末尾にスラッシュがない時は、「/about/」のようにアクセスすると404エラーが返ってきました。
①末尾にスラッシュありのエンドポイントはリダイレクトされる。
②末尾にスラッシュなしのエンドポイントは404エラーとなる。
このようなリダイレクションの挙動となっているようです。
なんとなく、スラッシュを意識した生活を心がけようと思います。
url_for関数(URLビルディング)
URLを取得する、というような意味あいのようです。この項目では、「@app.route()」のブロックで定義したWebアプリのURLをプログラムの中などで利用する際に、「url_for()」という関数を利用しましょう、というような内容となっています。
ハードコーディング(全部入力すること)と比較して、次のメリットが列挙されています。
・わかりやすい
・URLを手動で全てを変更しなくて良い
・特殊文字とUnicodeデータのエスケープ処理を行ってくれる
・常に絶対パスで生成される
・URLルートの外に配置されていても適切に処理してくれる
いくつかはわかりやすい理由ですが、URLルートの外に配置されたという点はなんだかピンとこないので、今後勉強していくうちに理解できるようになると思います 笑
使い方としては、サンプルプログラムで試してみます。
今回は、前回まで利用していた「hello.py」を上書きして利用します。
from flask import Flask, url_for
from markupsafe import escape
app = Flask(__name__)
@app.route('/')
def index():
return 'index'
@app.route('/login')
def login():
return 'login'
@app.route('/user/<username>')
def profile(username):
return '{}\'s profile'.format(escape(username))
with app.test_request_context():
print(url_for('index'))
print(url_for('login'))
print(url_for('login', next='/'))
print(url_for('profile', username='John Doe'))
こんな感じで、ターミナルに「url_for」で取得したURLが表示されました。
FlaskでURL取得するときは、url_for()を使えってことですね。