動的 Web アプリケーションのための意味のある URL

PythonBeginner
オンラインで実践に進む

はじめに

現代のウェブアプリケーションは、ユーザーに役立つ意味のある URL を使用しています。ページがユーザーが覚えて直接アクセスできる意味のある URL を使用している場合、ユーザーはそのページが好きになり、再度訪問する可能性が高くなります。この実験では、Flask で動的 URL を実装し、関数に複数のルールを追加する方法に焦点を当てます。

ルートデコレータ

このステップでは、route() デコレータを使用して、複数の URL に複数のビュー関数をバインドします。

  1. route_decorator.py ファイルを開き、Flask クラスをインポートしてインスタンスを作成します。
from flask import Flask
app = Flask(__name__)
  1. 次に、route() デコレータを使用して 2 つのルート //hello を作成し、対応するビュー関数をバインドし、それぞれ Index PageHello, World を返すようにします。
@app.route('/')
def index():
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello, World'
  1. スクリプトの main エントリポイントを作成して、Flask アプリケーションをポート 5000 で起動し、debug モードを有効にします。
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000, debug=True)
  1. アプリケーションを実行するには、まずターミナルで以下のコマンドを使用して Flask アプリケーションを起動します。
python3 route_decorator.py

次に、インターフェイス上部にある「Web 5000」タブを開き、ページを更新すると、Index Page のメッセージが表示されます。

ルート /hello の場合、上の URL バーに直接接尾辞 hello を追加することができます。

Flask route decorator example

すると、ページには Hello, World のメッセージが表示されます。

変数付きルール

このステップでは、URL に変数セクションを追加します。<variable_name> でセクションをマークすることで行います。任意で、<converter:variable_name> のようにコンバータを使用して引数の型を指定することもできます。

  1. variable_rules.py ファイルを開き、まず Flask クラスと escape をインポートし、次に Flask クラスのインスタンスを作成します。
from flask import Flask
from markupsafe import escape
app = Flask(__name__)
  1. route() デコレータでは、<variable_name><converter:variable_name> のパターンを追加して、変数セクション付きの動的 URL を作成します。ビュー関数はフォーマット済みの文字列を返すようにします。
@app.route('/user/<username>')
def show_user_profile(username):
    ## show the user profile for that user
    return f'User {escape(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 f'Post {post_id}'

@app.route('/path/<path:subpath>')
def show_subpath(subpath):
    ## show the subpath after /path/
    return f'Subpath {escape(subpath)}'
  • 以下は一般的なコンバータの種類の一覧です:
種類 役割
string (既定)スラッシュなしの任意のテキストを受け付けます
int 正の整数を受け付けます
float 正の浮動小数点数を受け付けます
path string と同じですが、スラッシュも受け付けます
uuid UUID 文字列受け付けます
  1. スクリプトの main エントリポイントを作成して、Flask アプリケーションをポート 5001 で起動し、debug モードを有効にします。
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5001, debug=True)
  1. アプリケーションを実行するには、まず新しいターミナルで以下のコマンドを使用して Flask アプリケーションを起動します。
python3 variable_rules.py

次に、インターフェイス上部にある「Web 5001」タブを開き、上の URL バーに直接接尾辞 user/Alice を追加します。

Flask dynamic URL example

すると、ページには User Alice のメッセージが表示されます。

  1. 接尾辞 post/1path/some/path に対しても同じ操作を繰り返すことができます。接尾辞 post/1 の場合、Post 1 のメッセージが表示されます。接尾辞 path/some/path の場合、Subpath some/path のメッセージが表示されます。

リダイレクト動作

このステップでは、末尾のスラッシュの使用方法に違いがある 2 つのルールを学びます。

  1. redirection_behavior.py ファイルを開き、Flask クラスをインポートしてインスタンスを作成します。
from flask import Flask
app = Flask(__name__)
  1. route() デコレータを使用して、projects と呼ばれるビュー関数を持つ /projects/ と呼ばれるルートを作成します。
@app.route('/projects/')
def projects():
    return 'The project page'

projects エンドポイントの標準的な URL には末尾のスラッシュがあります。これは、ファイルシステムのフォルダに似ています。末尾のスラッシュなし (/projects) で URL にアクセスすると、Flask は末尾のスラッシュ (/projects/) 付きの標準的な URL にリダイレクトします。

  1. about と呼ばれるビュー関数を持つ /about と呼ばれる別のルートを作成します。
@app.route('/about')
def about():
    return 'The about page'

about エンドポイントの標準的な URL には末尾のスラッシュがありません。これは、ファイルのパス名に似ています。末尾のスラッシュ (/about/) 付きで URL にアクセスすると、404 Not Found エラーが発生します。これにより、これらのリソースの URL を一意に保つことができ、検索エンジンが同じページを 2 回インデックスに登録するのを防ぐことができます。

  1. スクリプトの main エントリポイントを作成して、Flask アプリケーションをポート 5002 で起動し、debug モードを有効にします。
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5002, debug=True)
  1. アプリケーションを実行するには、まず新しいターミナルで以下のコマンドを使用して Flask アプリケーションを起動します。
python3 redirection_behavior.py

次に、インターフェイス上部にある「Web 5002」タブを開き、上の URL バーに直接接尾辞 projects を追加します。

Flask projects route example

すると、ページには The project page のメッセージが表示され、/projects/ のルートにリダイレクトされます。

projects の代わりに、別の接尾辞 about/ を追加します:

404 error page display

Not Found のメッセージが表示され、404 エラーが表示されます。接尾辞を about に変更すると、正しいメッセージ The about page が表示されます。

URL の構築

このステップでは、特定の関数への URL を生成するために url_for() 関数を使用します。この関数は、最初の引数として 関数名 を受け取り、任意の数のキーワード引数 を受け取ります。それぞれの引数は、URL ルールの可変部分に対応します。不明な可変部分は、URL の末尾にクエリパラメータとして追加されます。

  1. url_building.py ファイルを開き、まず Flask クラスと url_for をインポートします。また、Flask クラスのインスタンスを作成することを忘れないでください。
from flask import Flask, url_for
app = Flask(__name__)
  1. route() デコレータを使用して 3 つのルートを作成し、対応するビュー関数を定義します。
@app.route('/')
def index():
    return 'index'

@app.route('/login')
def login():
    return 'login'

@app.route('/user/<username>')
def profile(username):
    return f'{username}\'s profile'
  1. test_request_context() メソッドを使用して url_for() を試します。これにより、Flask は Python シェルを使用している間でも、リクエストを処理しているかのように振る舞うようになります。
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('index') は、ビュー関数 index の URL を生成し、/ となります。
  • url_for('login') は、ビュー関数 login の URL を生成し、/login となります。
  • url_for('login', next='/') は、ビュー関数 login の URL を生成し、追加のクエリパラメータ next を含み、/login?next=/ となります。
  • url_for('profile', username='John Doe') は、ユーザー名変数が John Doe に設定されたビュー関数 profile の URL を生成し、/user/John%20Doe となります。
  1. 新しいターミナルで url_building.py ファイルを直接実行します:
python3 url_building.py

出力結果は以下のようになるはずです:

/
/login
/login?next=/
/user/John%20Doe

まとめ

この実験では、意味のある URL を作成するためのさまざまな方法を学びました。これは、Web アプリケーションを設計する際に非常に重要です。Flask のルーティング機能を巧みに使うことで、ユーザー体験を向上させる、整理された直感的な URL を作成できます。