Web

[Python] BottleでURLからパラメーターを取得する方法

Bottleでは、URLからパラメーターを取得するために、ルート定義でパラメーターを指定し、関数内でその値を受け取ります。

URLパラメーターは<param>の形式でルートに記述し、関数の引数として渡されます。

例えば、@route('/hello/<name>')のように定義すると、/hello/Johnにアクセスした際にnameの値としてJohnが取得できます。

また、クエリパラメーターはrequest.queryを使って取得します。

URLパラメーターの取得方法

URLパラメーターとは?

URLパラメーターは、Webアプリケーションにおいて、特定のリソースを識別するためにURLに付加される情報です。

通常、URLの一部として / で区切られた形式で表現され、動的なコンテンツ生成やデータのフィルタリングに利用されます。

例えば、/user/123というURLでは、123がユーザーIDを示すパラメーターです。

ルート定義でのパラメーター指定

Bottleフレームワークでは、ルート定義の際にURLパラメーターを指定することができます。

以下のサンプルコードでは、<user_id>というパラメーターを定義しています。

from bottle import Bottle, run
app = Bottle()
@app.route('/user/<user_id>')
def show_user(user_id):
    return f'ユーザーID: {user_id}'
run(app, host='localhost', port=8080)

このコードを実行し、http://localhost:8080/user/123にアクセスすると、以下の出力が得られます。

関数でのパラメーター受け取り

ルートで定義したパラメーターは、対応する関数の引数として受け取ることができます。

上記の例では、show_user関数user_idを引数として受け取っています。

これにより、URLから取得した値を直接利用することが可能です。

パラメーターの型変換

Bottleでは、URLパラメーターは常に文字列として受け取られますが、必要に応じて型変換を行うことができます。

例えば、ユーザーIDを整数として扱いたい場合、以下のように型変換を行うことができます。

from bottle import Bottle, run
app = Bottle()
@app.route('/user/<user_id:int>')
def show_user(user_id):
    return f'ユーザーID: {user_id}(型: {type(user_id)})'
run(app, host='localhost', port=8080)

このコードを実行し、http://localhost:8080/user/123にアクセスすると、以下の出力が得られます。

このように、URLパラメーターの型を指定することで、受け取った値を自動的に変換することができます。

クエリパラメーターの取得方法

クエリパラメーターとは?

クエリパラメーターは、URLの末尾に ? で始まり、キーと値のペアで構成される情報です。

複数のパラメーターは & で区切られます。

例えば、http://example.com/search?query=python&sort=ascというURLでは、querysortがクエリパラメーターです。

これにより、特定のリソースをフィルタリングしたり、検索結果を制御したりすることができます。

request.queryを使ったクエリパラメーターの取得

Bottleフレームワークでは、request.queryを使用してクエリパラメーターを簡単に取得できます。

以下のサンプルコードでは、queryパラメーターを取得しています。

from bottle import Bottle, run, request
app = Bottle()
@app.route('/search')
def search():
    query = request.query.get('query', 'デフォルト値')
    return f'検索クエリ: {query}'
run(app, host='localhost', port=8080)

このコードを実行し、http://localhost:8080/search?query=pythonにアクセスすると、以下の出力が得られます。

デフォルト値の設定方法

request.query.get()メソッドを使用することで、クエリパラメーターが指定されていない場合のデフォルト値を設定できます。

上記の例では、queryパラメーターが存在しない場合に「デフォルト値」が返されます。

これにより、エラーを防ぎ、ユーザーに対して適切なフィードバックを提供できます。

複数のクエリパラメーターの処理

複数のクエリパラメーターを処理する場合も、request.queryを利用できます。

以下のサンプルコードでは、querysortの2つのパラメーターを取得しています。

from bottle import Bottle, run, request
app = Bottle()
@app.route('/search')
def search():
    query = request.query.get('query', 'デフォルト値')
    sort = request.query.get('sort', 'asc')
    return f'検索クエリ: {query}, ソート順: {sort}'
run(app, host='localhost', port=8080)

このコードを実行し、http://localhost:8080/search?query=python&sort=descにアクセスすると、以下の出力が得られます。

このように、複数のクエリパラメーターを簡単に取得し、処理することができます。

Bottleでのパラメーターのバリデーション

パラメーターのバリデーションの必要性

パラメーターのバリデーションは、Webアプリケーションのセキュリティと安定性を確保するために重要です。

ユーザーからの入力が期待される形式や範囲に合致しているかを確認することで、無効なデータや悪意のある攻撃からアプリケーションを保護できます。

バリデーションを行うことで、エラーを未然に防ぎ、ユーザーに対して適切なフィードバックを提供することが可能です。

型チェックの実装方法

Bottleでは、パラメーターの型チェックを簡単に実装できます。

以下のサンプルコードでは、user_idが整数であることを確認しています。

from bottle import Bottle, run, abort
app = Bottle()
@app.route('/user/<user_id:int>')
def show_user(user_id):
    if user_id <= 0:
        abort(400, 'ユーザーIDは正の整数でなければなりません。')
    return f'ユーザーID: {user_id}'
run(app, host='localhost', port=8080)

このコードを実行し、http://localhost:8080/user/-1にアクセスすると、以下のエラーメッセージが表示されます。

正規表現を使ったバリデーション

正規表現を使用することで、より複雑なバリデーションを実装できます。

以下のサンプルコードでは、メールアドレスの形式をチェックしています。

import re
from bottle import Bottle, run, abort, request
app = Bottle()
@app.route('/register', method='POST')
def register():
    email = request.forms.get('email')
    if not re.match(r'^[\w\.-]+@[\w\.-]+\.\w+$', email):
        abort(400, '無効なメールアドレスです。')
    return f'登録されたメールアドレス: {email}'
run(app, host='localhost', port=8080)

このコードを実行し、無効なメールアドレスを送信すると、以下のエラーメッセージが表示されます。

無効なメールアドレスです。

カスタムバリデーションの実装

カスタムバリデーションを実装することで、特定のビジネスロジックに基づいたチェックを行うことができます。

以下のサンプルコードでは、ユーザー名の長さをチェックしています。

from bottle import Bottle, run, abort, request
app = Bottle()
def validate_username(username):
    if len(username) < 3 or len(username) > 15:
        return False
    return True
@app.route('/register', method='POST')
def register():
    username = request.forms.get('username')
    if not validate_username(username):
        abort(400, 'ユーザー名は3文字以上15文字以下でなければなりません。')
    return f'登録されたユーザー名: {username}'
run(app, host='localhost', port=8080)

このコードを実行し、無効なユーザー名を送信すると、以下のエラーメッセージが表示されます。

ユーザー名は3文字以上15文字以下でなければなりません。

このように、カスタムバリデーションを使用することで、特定の要件に応じた柔軟なバリデーションを実装できます。

応用例:Bottleでのパラメーター利用

パラメーターを使った動的なページ生成

Bottleを使用すると、URLパラメーターを利用して動的なページを生成することができます。

以下のサンプルコードでは、ユーザーの名前をURLから取得し、挨拶文を表示しています。

from bottle import Bottle, run
app = Bottle()
@app.route('/greet/<name>')
def greet(name):
    return f'こんにちは、{name}さん!'
run(app, host='localhost', port=8080)

このコードを実行し、http://localhost:8080/greet/太郎にアクセスすると、以下の出力が得られます。

パラメーターを使ったAPIの実装

Bottleを使ってシンプルなAPIを実装することも可能です。

以下のサンプルコードでは、クエリパラメーターを使って特定のユーザー情報を取得するAPIを作成しています。

from bottle import Bottle, run, request
app = Bottle()
@app.route('/api/user')
def get_user():
    user_id = request.query.get('id')
    return {'user_id': user_id, 'name': '太郎', 'age': 30}
run(app, host='localhost', port=8080)

このコードを実行し、http://localhost:8080/api/user?id=123にアクセスすると、以下のJSON形式の出力が得られます。

パラメーターを使ったリダイレクト処理

URLパラメーターを利用して、リダイレクト処理を実装することもできます。

以下のサンプルコードでは、特定の条件に基づいて別のページにリダイレクトしています。

from bottle import Bottle, run, redirect, request
app = Bottle()
@app.route('/redirect')
def redirect_example():
    target = request.query.get('target', 'home')
    return redirect(f'/{target}')
@app.route('/home')
def home():
    return 'ホームページです。'
run(app, host='localhost', port=8080)

このコードを実行し、http://localhost:8080/redirect?target=homeにアクセスすると、ホームページにリダイレクトされます。

パラメーターを使ったデータベースクエリの実行

Bottleを使用して、クエリパラメーターを使ったデータベースクエリを実行することもできます。

以下のサンプルコードでは、SQLiteデータベースから特定のユーザー情報を取得しています。

import sqlite3
from bottle import Bottle, run, request
app = Bottle()
def get_user_from_db(user_id):
    conn = sqlite3.connect('example.db')
    cursor = conn.cursor()
    cursor.execute('SELECT name, age FROM users WHERE id = ?', (user_id,))
    user = cursor.fetchone()
    conn.close()
    return user
@app.route('/user/<user_id:int>')
def user_info(user_id):
    user = get_user_from_db(user_id)
    if user:
        return f'ユーザー名: {user[0]}, 年齢: {user[1]}'
    else:
        return 'ユーザーが見つかりません。'
run(app, host='localhost', port=8080)

このコードを実行し、http://localhost:8080/user/1にアクセスすると、データベースから取得したユーザー情報が表示されます。

データベースのセットアップが必要ですが、これによりパラメーターを使ったデータベースクエリの実行が可能になります。

まとめ

この記事では、Bottleフレームワークを使用してURLパラメーターやクエリパラメーターを取得し、さまざまな方法で活用する方法について解説しました。

具体的には、動的なページ生成やAPIの実装、リダイレクト処理、データベースクエリの実行など、実践的な応用例を通じて、パラメーターの取り扱い方を詳しく説明しました。

これを機に、Bottleを使ったWebアプリケーション開発に挑戦し、実際に自分のプロジェクトに応用してみてください。

関連記事

Back to top button
目次へ