【发布时间】:2020-06-28 09:30:15
【问题描述】:
我有一个使用 Flask-SQLAlchemy 运行良好的 Flask 应用程序但是当我创建多个用户并尝试同时登录时出现问题。
场景如下:假设用户 A 到达登录页面并登录并被重定向到单页 Web 应用程序,在该应用程序中显示他们的姓名来自数据库。
用户 B 到达登录页面并登录,然后被重定向到单页 Web 应用程序,在该应用程序中他们显示了来自数据库的信息。
用户 A 刷新他们的页面,发现他们以用户 B 的身份登录并且能够查看用户 B 的名称。
有没有办法防止这种情况/允许两个用户登录而不踢另一个用户?我一直在使用 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 flask-sqlalchemy flask-login