(Flask)のチュートリアルをやってみる!セッション



WEBアプリにはセッションが大切!か、どうかはわかりませんが「ログインしてページを表示する」ということができるというお話です。
会員サイトを作るとかなると、ログイン・ログオフは必要不可欠ですよね。では、Flaskでログイン画面を作るためのコードを書いて動きを見ていきましょう!

Flask-セッション

まずは、インポート文を見ておきます。インポートでFlaskに新しい機能を装備します。
from flask import Flask,(中略), session, escape
今回、新しく登場するのが「session」と「escape」です。
それぞれの機能を、簡単に確認しておきましょう。

session

sessionで入力した内容(今回であれば「ユーザー名」)をどのページに行っても保持しておけるという機能です。
ブラウザのCookieをい利用しているので、Cookieを許可していないブラウザだと正常に動かないかもしれまsん(試してはいませんが...)

eccape

続いてescapeは「文字を含む可能性のあるテキストをHTMLで表示する必要がある場合は、これを使用します」と公式を訳すると解説されています。今回は入力した内容を表示するのでescapeを使いますが、今回のサンプルでは、なくても文字の表示ができました、(でも、どこかで不都合が出てきそうなのでしっかり入れるようにしましょう。)

では、実際にsessionを扱うコードを見ていきましょう。

sessionのコード

<コード>
#-----セッションを使ってログイン・ログオフ画面をつくる-----
@app.route('/session_test/')
def session_test(): #ログインされているのかの確認
    if 'username' in session: #セッションのusernameに名前が入っているか確認
        return 'ログインしました! %s' % session['username'] #% escape(session['username']) #username入っている場合
    return 'ログインがされていません!' #username入っていない場合
@app.route('/login/', methods=['GET', 'POST'])
def login(): #ログインの処理
    if request.method == 'POST': #POST(コード内から来た場合)
        session['username'] = request.form['username']
        return redirect(url_for('session_test'))
    #GET(コードの外から来た場合)
    return '''
        <form action="" method="post">
            <p><input type=text name=username>
            <p><input type=submit value=ログイン>
        </form>
    '''
@app.route('/logout/')
def logout(): #ログアウトの処理
    session.pop('username', None) #sessionの中にあるusernameの内容を削除
    return redirect(url_for('session_test')) #session_testの処理に戻る 
#秘密鍵はここで作る ' 'の中に好きな秘密パスワードを入れる
app.secret_key = 'aaaa'
今回は、公式のサンプルでほぼ動かすことができますが、3つの処理をする関係で少々長くなっていますので、最初に動きを確認しておきましょう。

sessionが動いているかの確認手順

  1. http://127.0.0.1:5000/session_test/ にアクセス → ログインがされていません! が表示される


  2. http://127.0.0.1:5000/login/ にアクセス → テキストを入れる画面とログインボタンが表示される、名前などを入力して「ログイン」をクリックすると、再度、http://127.0.0.1:5000/session_test/にアクセスされる。




  3. 今度は、入力した名前が表示されます。



  4. 続いて、http://127.0.0.1:5000/loout/にアクセス →瞬間で「1.」の状態に戻ります。


それでは、各コードの中身を見ていきます。

sessionのコード解説

@app.route('/session_test/')

@app.route('/session_test/')
def session_test(): #ログインされているのかの確認
    if 'username' in session: #セッションのusernameに名前が入っているか確認
        return 'ログインしました! %s さん' % session['username'] 
    return 'ログインがされていません!' #username入っていない場合
ここはコメントを入れているので比較的簡単かもしれません。sessionの中の「username」に名前(文字列)が入っているかいないかで処理を変えています。
文字列が入っているときには、sessionの文字列を表示します。文字列が入っていないときには「ログインされていません!」を表示します。

@app.route('/login/', methods=['GET', 'POST'])

@app.route('/login/', methods=['GET', 'POST'])
def login(): #ログインの処理
    if request.method == 'POST': #POST(コード内から来た場合)
        session['username'] = request.form['username']
        return redirect(url_for('session_test')) 
    #GET(コードの外から来た場合)
    return '''
        <form action="" method="post">
            <p><input type=text name=username>
            <p><input type=submit value=ログイン>
        </form>
    '''
ログイン処理をするコードです。POSTとGETが出てきているので、ここで再度復習をしておきましょう。
コードはPOSTからですが、解説はGETからいきます。
http://127.0.0.1:5000/login/にアクセスがあったら、
    return '''
        <form action="" method="post">
            <p><input type=text name=username>
            <p><input type=submit value=ログイン>
        </form>
    '''
の処理が実行されます。inputボックスとボタンを表示します。ログインボタンが押されたらPOSTの処理が実行されます。
 request.method == 'POST': #POST(コード内から来た場合)
        session['username'] = request.form['username']
        return redirect(url_for('session_test')) 
まず、sessionのusernameにフォームで入力されたusernameをを入れます。
そのあと、リダイレクトでhttp://127.0.0.1:5000/session_test/へ行きます。
ここで再び@app.route('/session_test/')が実行されて、今後は「username」に文字が入っているので、return 'ログインしました! %s さん' % session['username'] の処理がされます。

@app.route('/logout/')

@app.route('/logout/')
def logout(): #ログアウトの処理
    session.pop('username', None) #sessionの中にあるusernameの内容を削除
    return redirect(url_for('session_test')) #session_testの処理に戻る
ログインとセットでログアウトの処理を見ていきましょう。と、いってもsessionのusernameを削除するだけです。
session.pop('username', None) でusernameの中身を空っぽにして、return redirect(url_for('session_test')) でhttp://127.0.0.1:5000/session_test/へ行きます。

秘密鍵の設定も忘れずに

sessionでは秘密鍵も必須になります。秘密鍵のコードは 
app.secret_key = 'aaaa'
の部分です。aaaaが今回の秘密鍵ですが、実際にはランダムな英数字を並べて作成したり、ランダムで秘密鍵を生成します。短い一文ですが、これがないとプログラムが正常に動作せず、困り果てる原因になります(汗)

もちろん、このままでは実用には向かないので(そもそもパスワードの設定すらできていない)ので「入力した内容が引き継がれるんだな」ということを覚えられれば、ここはクリアです!