为什么我不能让不同的用户访问我的 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
我有一个 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