2016-07-11 8 views
2

私はFlaskフレームワークを初めて使用しています。私は道に沿ってthisチュートリアルに従っています。session.pop()はクッキーをクリアしません

シリーズのUser Authenticationチュートリアルごとに、私は以下で立ち往生していたよう:

チュートリアルでは、ユーザーが/logoutルートを押すことでログアウトすると、発生した最初のものは次のとおりです。

session.pop('logged_in', None) 

上記の動画のとおり、ユーザーが/logoutにアクセスした瞬間に、Cookieもブラウザから削除されます。私の場合は

  1. 、チュートリアルとまったく同じ設定で、セッションはサーバー側から無効になっかもしれませんが、クッキーを削除/いずれにも変更されません:今ここに2つの質問が

    /logoutルートがヒットした後、ブラウザから何か間違っていますか?

  2. session.pop(...) => how/whyはブラウザのフロントエンドから何かを削除しますか?それはサーバー上のものだけを制御することができますか?下記は、参考のために

すべてのセッションの最初とクッキーが同じではありません

# import the Flask class from the flask module 
from flask import Flask, render_template, redirect, url_for, request, session, flash 


# create the application object 
app = Flask(__name__) 

app.secret_key = 'my precious' 


# use decorators to link the function to a url 
@app.route('/') 
def home(): 
    return "Hello, World!" # return a string 
    #return render_template(index.html) 


@app.route('/welcome') 
def welcome(): 
    return render_template('welcome.html') # render a template 


# route for handling the login page logic 
@app.route('/login', methods=['GET', 'POST']) 
def login(): 
    error = None 
    if request.method == 'POST': 
     if request.form['username'] != 'admin' or request.form['password'] != 'admin': 
      error = 'Invalid Credentials. Please try again.' 
     else: 
      session['logged_in'] = True 
      flash('You were just logged in') 
      return redirect(url_for('home')) 
    return render_template('login.html', error=error) 


@app.route('/logout') 
def logout(): 
    session.pop('logged_in', None) 
    flash('You were just logged out') 
    return redirect(url_for('welcome')) 


# start the server with the 'run()' method 
if __name__ == '__main__': 
    app.run(debug=True) 
+0

それは無効になります、0にクッキーの有効期限を設定することができます。バックエンドフラスコのアプリが既にポップアップしていたにもかかわらず、セッションはブラウザに残りました。だから私はフラスコのバックエンドは、ブラウザで直接セッションを削除することはできないと思う。私の推測では、セッションにタイムアウトが指定されている可能性はありますか? – ifelsemonkey

答えて

1
  1. (チュートリアル自体から取られた)私のコードです。セッションはブラウザに投稿された一意のIDのようなもので、バックエンドの辞書のキーのようなものです。ほとんどの場合、セッションID(セッションIDではなく)を変更すると、バックエンド部分を変更するだけです(バックエンド辞書の値をそのキーで追加または削除します)。ブラウザのクッキーではありません。
  2. あなたはすべて正しいことを理解しました。セッションサーバーから「ログイン」すると、このブラウザはこれ以上ログに記録されません。

ここではクッキーはクライアントブラウザを識別するために使用されています。それだ。

+0

私はクッキーとセッションが異なることを理解します。しかし、IMHOは、上記の私の場合、ブラウザを識別するだけでなく、セッションクッキーであると思われます。しかし、私が困惑しているのは、ビデオの中でsession.pop()によってクッキーが削除されることです。あなたは私またはビデオの著者(非常にありそうもない)ここに何かを逃したと思いますか? – qre0ct

1

あなたは、これは私が同じ観測をエコー

@app.route('/logout') 
def logout(): 
    session.pop('token', None) 
    message = 'You were logged out' 
    resp = app.make_response(render_template('login.html', message=message)) 
    resp.set_cookie('token', expires=0) 
    return resp   
+0

私はクッキーの有効期限を設定すると有効期限を過ぎても有効ではないことを理解しています。しかし、私が困惑しているのは、どのビデオがsession.pop()によってクッキーが削除されるのかです。何かがちょうど右に収まるように見えません! – qre0ct

+1

フラスコのソースコードセッション辞書にもっと詳しく調べると、最終的なHTTPレスポンスオブジェクトを作成するために使用されます。セッション辞書からlogged_inを削除すると、削除するCookieが最終的に設定されます – Sugam

関連する問題