Bottleフレームワークでのセッション管理
Webアプリケーションでは、ユーザーの状態やデータを一定期間保持するためにセッション管理が必要です。
Bottleフレームワークでは、クッキーを使ったセッション管理とサーバーサイドでのセッション管理の2つの方法があります。
それぞれの方法について解説します。
クッキーを使ったセッション管理
クッキーを使ったセッション管理では、ユーザーのブラウザにデータを保存し、それを利用してセッションを管理します。
Bottleフレームワークでは、response.set_cookie
関数とrequest.get_cookie
関数を使ってクッキーを扱うことができます。
以下は、クッキーを使ったセッション管理のサンプルコードです。
from bottle import route, run, request, response, template
@route('/login', method='POST')
def login():
username = request.forms.get('username')
password = request.forms.get('password')
if username == 'admin' and password == 'password':
response.set_cookie('username', username)
return template('ログインに成功しました。ユーザー名: {{username}}', username=username)
else:
return 'ログインに失敗しました。'
@route('/dashboard')
def dashboard():
username = request.get_cookie('username')
if username:
return template('ダッシュボードへようこそ!ユーザー名: {{username}}', username=username)
else:
return 'ログインしてください。'
run(host='localhost', port=8080)
このコードでは、/login
にPOSTリクエストが送信された際に、ユーザー名とパスワードを取得し、正しい組み合わせであればクッキーにユーザー名を保存します。
その後、/dashboard
にアクセスした際に、クッキーからユーザー名を取得し、ログイン状態を確認します。
サーバーサイドでのセッション管理
サーバーサイドでのセッション管理では、サーバー側にデータを保存し、それを利用してセッションを管理します。
Bottleフレームワークでは、bottle-session
というサードパーティ製のライブラリを使ってサーバーサイドでのセッション管理を実現できます。
まず、bottle-session
をインストールします。
pip install bottle-session
以下は、サーバーサイドでのセッション管理のサンプルコードです。
from bottle import route, run, request, response, template
from bottle.ext import session
app = Bottle()
plugin = session.SessionPlugin(cookie_lifetime=600)
app.install(plugin)
@route('/login', method='POST')
def login(session):
username = request.forms.get('username')
password = request.forms.get('password')
if username == 'admin' and password == 'password':
session['username'] = username
return template('ログインに成功しました。ユーザー名: {{username}}', username=username)
else:
return 'ログインに失敗しました。'
@route('/dashboard')
def dashboard(session):
username = session.get('username')
if username:
return template('ダッシュボードへようこそ!ユーザー名: {{username}}', username=username)
else:
return 'ログインしてください。'
run(app, host='localhost', port=8080)
このコードでは、bottle-session
を使ってセッション管理を行っています。
/login
にPOSTリクエストが送信された際に、ユーザー名とパスワードを取得し、正しい組み合わせであればセッションにユーザー名を保存します。
その後、/dashboard
にアクセスした際に、セッションからユーザー名を取得し、ログイン状態を確認します。
以上が、Bottleフレームワークでのセッション管理の方法です。
クッキーを使ったセッション管理は簡単に実装できますが、セキュリティ上のリスクがあるため、サーバーサイドでのセッション管理を検討することも重要です。
Bottleフレームワークでのエラーハンドリング
Webアプリケーション開発において、エラーハンドリングは重要な要素の一つです。
Bottleフレームワークでは、エラーページのカスタマイズや例外処理の実装が容易に行えます。
この章では、Bottleフレームワークでのエラーハンドリングについて解説します。
エラーページのカスタマイズ
Bottleフレームワークでは、error
デコレータを使ってエラーページをカスタマイズすることができます。
以下に、404エラー(ページが見つからない)と500エラー(サーバーエラー)のカスタマイズ例を示します。
from bottle import Bottle, error, run
app = Bottle()
@app.error(404)
def error404(error):
return "404エラー:お探しのページは見つかりませんでした。"
@app.error(500)
def error500(error):
return "500エラー:サーバーで問題が発生しました。"
if __name__ == "__main__":
run(app, host="localhost", port=8080)
上記のコードでは、@app.error(エラーコード)
というデコレータを使って、エラーコードに対応するエラーページを定義しています。
これにより、指定したエラーコードが発生した際に、カスタマイズしたエラーページが表示されます。
試しに上記コードを実行して、localhost:8080
やlocalhost:8080/sample
など定義していない(存在しない)ページにアクセスしてみてください。

404エラーのページが開かれるはずです。
例外処理の実装
Bottleフレームワークでは、Pythonの標準的な例外処理機能(try
、except
)を使って、エラーが発生した際の処理を実装することができます。
以下に、例外処理を用いたデータベース操作の例を示します。
from bottle import Bottle, route, run, template
import sqlite3
app = Bottle()
@app.route("/user/<user_id>")
def user_profile(user_id):
try:
conn = sqlite3.connect("users.db")
c = conn.cursor()
c.execute("SELECT * FROM users WHERE id=?", (user_id,))
user = c.fetchone()
conn.close()
if user is not None:
return template("user_profile", user=user)
else:
return "ユーザーが見つかりませんでした。"
except sqlite3.Error as e:
return f"データベースエラーが発生しました: {e}"
if __name__ == "__main__":
run(app, host="localhost", port=8080)
上記のコードでは、try
ブロック内でデータベース操作を行っています。
もしデータベース操作中にエラーが発生した場合、except
ブロック内の処理が実行され、エラーメッセージが表示されます。
このように、Bottleフレームワークではエラーハンドリングが容易に行えるため、安定したWebアプリケーションを開発することができます。