我正在关注本教程:https://www.geeksforgeeks.org/how-to-add-authentication-to-your-app-with-flask-login/ 但是当我运行代码时,我打开 2 个选项卡,然后注册到 test1 和 test2,但是第一个选项卡被覆盖并且都显示 test2,但我想允许多个帐户,例如不和谐或 Instagram,如果我打开了 2 个选项卡,我可以拥有2 个帐户,如果我关闭它们或打开一个新帐户,它只会打开最新登录的帐户
要在不同的浏览器选项卡中登录不同的帐户,您需要避免选项卡之间的会话共享。默认情况下,Flask 使用 cookie 来存储会话,该会话在同一浏览器中的所有选项卡之间共享。这就是为什么当您在一个选项卡上登录时,它会覆盖其他选项卡中的会话。
您可以使用 JWT(Json Web 令牌)来管理每个选项卡的身份验证。每个选项卡都有自己的令牌,允许不同的用户同时登录。
这是示例代码片段。
from flask import Flask, request, jsonify, render_template, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import generate_password_hash, check_password_hash
import jwt
import datetime
from functools import wraps
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
db = SQLAlchemy(app)
# User model
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(50), unique=True)
password = db.Column(db.String(80))
# Utility to generate tokens
def token_required(f):
@wraps(f)
def decorated(*args, **kwargs):
token = request.cookies.get('token')
if not token:
return jsonify({'message': 'Token is missing!'}), 403
try:
data = jwt.decode(token, app.config['SECRET_KEY'], algorithms=["HS256"])
current_user = User.query.filter_by(username=data['username']).first()
except:
return jsonify({'message': 'Token is invalid!'}), 403
return f(current_user, *args, **kwargs)
return decorated
@app.route('/signup', methods=['POST'])
def signup():
data = request.form
hashed_password = generate_password_hash(data['password'], method='sha256')
new_user = User(username=data['username'], password=hashed_password)
db.session.add(new_user)
db.session.commit()
return jsonify({'message': 'Registered successfully!'})
@app.route('/login', methods=['POST'])
def login():
data = request.form
user = User.query.filter_by(username=data['username']).first()
if not user or not check_password_hash(user.password, data['password']):
return jsonify({'message': 'Login failed!'})
token = jwt.encode({
'username': user.username,
'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=30)
}, app.config['SECRET_KEY'])
# Set token in cookies
response = jsonify({'message': 'Login successful!'})
response.set_cookie('token', token, httponly=True)
return response
@app.route('/logout', methods=['POST'])
@token_required
def logout(current_user):
response = jsonify({'message': 'Logged out successfully!'})
response.set_cookie('token', '', expires=0)
return response
@app.route('/profile')
@token_required
def profile(current_user):
return jsonify({
'username': current_user.username,
'message': 'This is your profile'
})
if __name__ == '__main__':
db.create_all()
app.run(debug=True)
您可以找到更多在 Flask 应用程序中使用 JWT 进行身份验证的教程和博客。我希望这对你有一点帮助。