Python 页面更改时,Flask登录会话不会持久化

Python 页面更改时,Flask登录会话不会持久化,python,session,flask,flask-login,flask-socketio,Python,Session,Flask,Flask Login,Flask Socketio,我在python中使用flask登录、flask和socketio。当我登录用户时,可以在login_data()函数中看到,会话变量通过flask login正确设置。但是,当路由更改时,所有会话变量都将丢失,这将导致flask登录不允许用户访问/overview页面。我已经尝试了很长时间,也无法思考会话变量丢失的原因,我已经在chrome、firefox和internet explorer中尝试过了,所有的结果都是一样的 p、 我知道我不是在对密码进行哈希运算,我会在这之后着手处理 main

我在python中使用flask登录、flask和socketio。当我登录用户时,可以在login_data()函数中看到,会话变量通过flask login正确设置。但是,当路由更改时,所有会话变量都将丢失,这将导致flask登录不允许用户访问/overview页面。我已经尝试了很长时间,也无法思考会话变量丢失的原因,我已经在chrome、firefox和internet explorer中尝试过了,所有的结果都是一样的

p、 我知道我不是在对密码进行哈希运算,我会在这之后着手处理

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)

我自己也找到了答案。由于某些未知原因,您无法在flask socketio事件处理程序中使用flask login的login_user函数,必须通过正常的post请求来完成


希望这对某人有所帮助。

是的,这是正确的。Flask Login的Login_user函数修改用户会话,Flask SocketIO在更改用户会话方面施加了某些限制。看见