2016-08-07 17 views
1

私はフラスコログイン、フラスコ、およびソケットをPythonで使用しています。 login_data()関数で見られるようにユーザーにログインすると、セッション変数はフラスコログインによって正しく設定されます。しかし、ルートが変更されると、セッション変数のすべてが失われ、フラスコのログインによってユーザーは/ overviewページにアクセスできなくなります。私は長い間努力してきましたが、セッション変数が失われた理由を考えることができませんでした。私はクロム、ファイアウォール、インターネットエクスプローラで同じ結果を試しました。フラスコのログインセッションは、ページが変更されても持続しない

p.s - 私はパスワードをハッシングしていないことを知っています。

main.py:

#Store 
from flask import * 
import nltk 
import functools 
import re 
from users import User 
#from flask_socketio import SocketIO,send,emit,disconnect 
from flask_socketio import * 
from flask_login import LoginManager,login_user,current_user,login_required 
import flask_login 
from pymongo import MongoClient 
client = MongoClient() 
db = client.database 

app = Flask(__name__) 
app.secret_key= 'lemon' 
socketio = SocketIO(app) 
login_manager = LoginManager() 
login_manager.init_app(app) 

@login_manager.user_loader 
def load_user(email): 
    print('email given: '+email) 
    cursor = db.users.find_one({"user.email":str(email)}) 
    if not cursor: 
     return None 
    return User(email) 



@app.route('/') 
def home(): 
    print('overview session') 
    for i in session: 
     print(session[i]) 
    return render_template('index.html') 



@app.route('/login') 
def login(): 

    return render_template('login.html') 


@app.route('/overview') 
@login_required 
def overview(): 
    return render_template('overview.html') 

@socketio.on('login_data') 
def login_data(email,password): 
    cursor = db.users.find_one({"user.email":str(email),"user.password":str(password)}) 
    if cursor: 
     user = User(cursor['user']['email']) 
     print(user.get_id()) 
     login_user(user,remember=True) 
     print('sessions') 
     for i in session: 
      print(session[i]) 

     emit('auth',[True,current_user.email]) 
    else: 
     emit('auth',False) 



if __name__ == '__main__': 
    socketio.run(app,host='0.0.0.0',debug=True) 

ユーザークラス:

#Users.py 
from pymongo import MongoClient 
class User(object): 
    def __init__(self,email): 
     self.email = email 

    def is_authenticated(self): 
     return True 
    def is_active(self): 
     return True 
    def is_anonymous(self): 
     return False 
    def get_id(self): 
     return unicode(self.email) 

答えて

1

私はこの答えを自分自身を発見しました。いくつかの未知の理由のためにフラスコ - ソケットイベントハンドラの内部でフラスコログインのlogin_user関数を使用することはできませんが、代わりに通常のポストリクエストを通じて行う必要があります。

これは誰かを助けることを望みます。

+0

はい、これは正しいです。 Flask-Loginのlogin_user関数はユーザーセッションを変更し、Flask-SocketIOがユーザーセッションを変更する際の制限があります。 https://flask-socketio.readthedocs.io/en/latest/#access-to-flask-s-context-globalsを参照してください。 – Miguel

関連する問題