フラスコセッション(セッション)
HTTPはステートレスであるため、クライアントの一連のアクションを記録できません。サーバーがクライアントを認識できるようにするメカニズムが必要です。これにより、「セッション」の概念が導入され
ます!サーバーはクライアントにセッションIDを送信し、クライアントがサーバーに再度アクセスするとこのIDでは、サーバーはこの一意のIDを使用してユーザーを識別します。
Cookieとは異なり、セッションデータはサーバーに保存されます。セッションは、クライアントがサーバーにログインしてサーバーからログアウトするまでの時間間隔です。このセッションで保存する必要があるデータは、サーバーの一時ディレクトリに保存されます。
各クライアントのセッションにセッションIDを割り当てます。セッションデータはCookieの上に保存され、サーバーは暗号化して署名します。この暗号化のために、Flaskアプリケーションには定義済みのSECRET_KEYが必要です。
Sessionオブジェクトはディクショナリオブジェクトでもあり、セッション変数と関連する値のキーと値のペアが含まれています。
たとえば、「username」セッション変数を設定するには、次のステートメントを使用します。
Session['username'] = 'admin'
セッション変数を解放するには、pop()メソッドを使用します。
session.pop('username', None)
次のコードは、Flaskでのセッション作業の簡単なデモです。セッション変数「 username 」が設定されていないため、URL 「/」はユーザーにログインを促すだけです。
@app.route('/')
def index():
if 'username' in session:
username = session['username']
return 'Logged in as ' + username + '<br>' + \
"<b><a href = '/logout'>click here to log out</a></b>"
return "You are not logged in <br><a href = '/login'></b>" + \
"click here to log in</b></a>"
ユーザーが「/ login」login()ビュー関数を参照すると、GETメソッドによって呼び出されるため、ログインフォームが開きます。
フォームは'/ login'に送り返され、セッション変数が設定されます。アプリケーションは'/'にリダイレクトします。この時点で、セッション変数「 username 」が見つかりました。
@app.route('/login', methods = ['GET', 'POST'])
def login():
if request.method == 'POST':
session['username'] = request.form['username']
return redirect(url_for('index'))
return '''
<form action = "" method = "post">
<p><input type = text name = username/></p>
<p<<input type = submit value = Login/></p>
</form>
'''
アプリケーションには、「username」セッション変数をポップアップ表示するlogout()ビュー関数も含まれています。したがって、「/」の URLは開始ページを再び表示します。
@app.route('/logout')
def logout():
# remove the username from the session if it is there
session.pop('username', None)
return redirect(url_for('index'))
アプリケーションを実行し、ホームページにアクセスします。(アプリケーションのsecret_keyを必ず設定してください)
from flask import Flask, session, redirect, url_for, escape, request
app = Flask(__name__)
app.secret_key = 'any random string’
完全なコードは次のとおりです
from flask import Flask
from flask import render_template
from flask import request
from flask import make_response
from flask import Flask, session, redirect, url_for, escape, request
app = Flask(__name__)
app.secret_key = 'fkdjsafjdkfdlkjfadskjfadskljdsfklj'
@app.route('/')
def index():
if 'username' in session:
username = session['username']
return '登录用户名是:' + username + '<br>' + "<b><a href = '/logout'>点击这里注销</a></b>"
return "您暂未登录, <br><a href = '/login'></b>" + "点击这里登录</b></a>"
@app.route('/login', methods = ['GET', 'POST'])
def login():
if request.method == 'POST':
session['username'] = request.form['username']
return redirect(url_for('index'))
return '''
<form action = "" method = "post">
<p><input type ="text" name ="username"/></p>
<p><input type ="submit" value ="登录"/></p>
</form>
'''
@app.route('/logout')
def logout():
# remove the username from the session if it is there
session.pop('username', None)
return redirect(url_for('index'))
if __name__ == '__main__':
app.run(debug = True)
出力は以下のようになります。クリック「にログインするには、ここをクリックし、」リンク。
リンクは別の画面に送られます。「admin」と入力します。
画面に「ログインユーザー名はadminです 」というメッセージが表示されます 。