2016-08-07 3 views
1

플라스크 로그인, 플라스크 및 소켓 오니를 파이썬으로 사용하고 있습니다. login_data() 함수에서 볼 수있는 것처럼 사용자에게 로그인하면 세션 변수가 flask-login에 의해 올바르게 설정됩니다. 그러나 경로가 변경되면 모든 세션 변수가 손실되어 플라스크 로그인으로 인해 사용자가/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

나 자신이 답을 발견했다. 어떤 미지의 이유로 flask-socketio 이벤트 핸들러 내부에서 flask-login의 login_user 함수를 사용할 수 없으므로 대신 일반 우편 요청을 통해 수행해야합니다.

희망이 있으면 도움이됩니다.

+0

네, 맞습니다. Flask-Login의 login_user 함수는 사용자 세션을 수정하며 사용자 세션을 변경하는 것과 관련하여 Flask-SocketIO에 의해 부과 된 특정 제한 사항이 있습니다. https://flask-socketio.readthedocs.io/en/latest/#access-to-flask-s-context-globals를 참조하십시오. – Miguel

관련 문제