为什么我不能让不同的用户访问我的 Flask 应用程序并在同一页面上获取不同的数据

Why can't I get different users access my Flask app and get different data on the same page

我有一个 Flask 应用程序 运行 Flask-SQLAlchemy 一切都很好但是当我创建多个用户并尝试同时登录时出现问题。

场景如下:假设用户 A 到达登录页面并登录,然后被重定向到单页 Web 应用程序,在那里显示他们来自数据库的姓名。

用户 B 到达登录页面并登录,然后被重定向到单页 Web 应用程序,其中显示了他们来自数据库的信息。

用户 A 刷新他们的页面,发现他们以用户 B 的身份登录,并且能够查看用户 B 的名称。

有没有办法防止 this/allow 两个用户同时登录而不踢掉另一个用户?我一直在使用 Flask-login 也没有解决。帮帮我。

from flask import Flask, render_template, url_for, request , redirect
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
from flask_login import LoginManager, UserMixin, login_user, login_required
import random
import string


app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydb.db'
db = SQLAlchemy(app)
login_Manager = LoginManager()
login_Manager.init_app(app)
login_Manager.login_view = 'login'



class Accounts(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key = True)
    Name = db.Column(db.String(50), nullable = False)
    User_name = db.Column(db.String(50), nullable = False)
    Email = db.Column(db.String(75), nullable = False)
    Password = db.Column(db.String(75), nullable = False)
    session_token = db.Column(db.String(40), index=True) 
    date_created = db.Column(db.DateTime, default = datetime.utcnow)

    def get_id(self):                                                           
        return str(self.session_token)

    def __repr__(self):
        return str(self.Name)

@login_Manager.user_loader
def load_user(session_token):
    return Accounts.query.filter_by(session_token = session_token).first()
    

@app.route('/login/', methods=["POST","GET"])
def login():
    if request.method == "POST":
        user_name = request.form['username']
        user_password = request.form['password']
        all_accounts = Accounts.query.all()
        for account in all_accounts:
            if account.User_name == user_name and account.Password == user_password:
                N = 40
                tokk = ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(N))
                
                luser = Accounts.query.get(account.id)
                luser.session_token = tokk
                db.session.commit()
                
                user = Accounts.query.get(account.id)
                login_user(user)
                global name_user
                name_user =  Accounts.query.get(user_id)
                return redirect('/Home')
        return """<h1>Something Happened While logging you in <h1> <a href="/login">Retry</a>"""
    else:
        return render_template('login.html')


@app.route('/Home')
@login_required
def home():
    return render_template('Home.html', NAME = name_user )


if __name__ == "__main__":
    app.secret_key = 'thismysecretekey'
    app.run(debug=True)

还有我的主页..

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <title>Home</title>
</head>
<body>
    <div >

        <p>Logged as: <b>{{ NAME }}</b></p>
        <hr class="popline">
        <br>
    </div>
</body>
</html>

您的问题是您在 Flask 中使用全局变量 - 根本不推荐,这会导致您的问题。您会看到,当用户登录时,您将代码编写为 "name_user" 给刚登录的用户。这就是每次新用户登录该站点时它都会更改用户的原因。幸运的是,您使用的是 flask-login,因此您可以简单地使用 current_user.Name 来获取当前登录用户的名称。

总而言之:

代替:

return render_template('Home.html', NAME = name_user )

做:

return render_template('Home.html', NAME = current_user.Name)

并且不要忘记从 flask_login

导入 current_user
from flask_login import current_user