Flask Tutorials

Flaskのredirect()関数による安全なデータ受け渡し

Spread the love

Flaskのredirect()関数は、ユーザーをウェブアプリケーション内を案内する上で不可欠です。フォーム送信やログインなど、特定のアクションの後、ユーザーをシームレスに異なるURLへ遷移させることができます。しかし、単純なリダイレクトだけでは不十分な場合も多く、新しいページにデータを渡す必要があることがよくあります。この記事では、Flaskアプリケーションでパラメータと共にredirect()を効果的に使用する方法を説明し、セキュリティのベストプラクティスに焦点を当てます。

目次

パラメータ受け渡しが必要となる理由

コアとなるredirect()関数は、本質的にパラメータを直接渡すことをサポートしていません。入力としてURLを受け取ります。データを送信するには、URLパラメータまたはサーバー側のセッション管理を利用する必要があります。

方法1:機密でないデータにURLパラメータを使用する

最も一般的なアプローチは、クエリ文字列(疑問符「?」の後の部分)としてURLにパラメータを追加することです。パラメータは、アンパサンド「&」で区切られたキーと値のペアです。


from flask import Flask, render_template, redirect, url_for, request

app = Flask(__name__)

@app.route('/form', methods=['GET', 'POST'])
def my_form():
    if request.method == 'POST':
        name = request.form['name']
        age = request.form['age']
        return redirect(url_for('success', name=name, age=age))
    return render_template('form.html')

@app.route('/success')
def success():
    name = request.args.get('name')
    age = request.args.get('age')
    return f"Success! Name: {name}, Age: {age}"

if __name__ == '__main__':
    app.run(debug=True)

<form method="POST">
    <label for="name">名前:</label>
    <input type="text" id="name" name="name"><br><br>
    <label for="age">年齢:</label>
    <input type="text" id="age" name="age"><br><br>
    <input type="submit" value="送信">
</form>

これにより、/success?name=John&age=30のようなURLが作成されます。url_forはパラメータ処理を簡素化します。

方法2:機密データにFlaskセッションを使用する

機密データ(ユーザーID、認証トークンなど)には、決してURLパラメータを使用しないでください。Flaskのセッションオブジェクトは、ユーザーのセッションにデータを関連付けるサーバー側のストレージを提供します。


from flask import Flask, render_template, redirect, url_for, request, session

app = Flask(__name__)
app.secret_key = 'your_secret_key'  # 強力なランダムに生成されたキーに置き換えてください

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        # ...認証ロジック...
        if username == "validuser":
            session['username'] = username
            return redirect(url_for('dashboard'))
    return render_template('login.html')

@app.route('/dashboard')
def dashboard():
    username = session.get('username')
    if username:
        return f"ようこそ、{username}さん!"
    else:
        return redirect(url_for('login'))

if __name__ == '__main__':
    app.run(debug=True)

非常に重要です。強力でランダムに生成されたsecret_keyを設定してください。これはセッションデータの暗号化に不可欠です。

適切な方法の選択

URLに表示される機密でないデータにはURLパラメータを使用します。機密性を維持する必要がある機密データにはセッションを使用します。

このガイドは、Flaskのredirect()関数を使用した安全で効率的なパラメータ受け渡しを示し、スムーズで安全なユーザーエクスペリエンスを保証します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です