В моем приложении фляги я использую флеш-логин для управления входами и выходами пользователей.
Я уже добавил секретный ключ в мой файл конфигурации.Кроме того, я звоню {{login_form.csrf_token}} в начале формы.Однако, когда я пытался войти в систему с пользователем, иногда я получаю ошибку 400 (неверный запрос), которая не совпадает с жалобами на токены.После проверки поля csrf я понимаю, что оно всегда генерирует одни и те же несколько токенов.Чтобы уточнить сценарии, в которых я принимаю эту ошибку:
- Когда пользователь-1 вошел в систему, если я попытался войти в систему с пользователем-2 и если форма генерирует тот же токен
- Когда я вышел из системы с пользователем-1, и попытался повторно войти в систему с тем же пользователем, и если форма генерирует тот же самый токен
Я думаю, он каким-то образом не может определить токены, которые уже используются илитокены не освобождаются после выхода из системы.Я занимаюсь этой проблемой почти 2 дня и не могу понять, почему это происходит.Пожалуйста, помогите, ребята
маршрут входа
@bp.route('/login', methods=['GET', 'POST'])
def login():
if current_user.is_authenticated:
if current_user.has_role(['Super Admin', 'Admin']):
return redirect(url_for('admin.admin_dash'))
if current_user.has_role(['Gym']):
return redirect(url_for('gym.gymmain'))
form = LoginForm()
if form.validate_on_submit():
print("FORM VALIDATED !!")
user = SuperUser.query.filter_by(email=form.email.data).first()
if user is None or not user.check_password(form.password.data):
flash('Invalid email or password')
return redirect(url_for('auth.login'))
login_user(user, remember=form.remember_me.data)
next_page = request.args.get('next')
if not next_page or url_parse(next_page).netloc != '':
if current_user.has_role(['Super Admin', 'Admin']):
next_page = url_for('admin.admin_dash')
if current_user.has_role(['Gym']):
next_page = url_for('gym.gymmain')
return redirect(next_page)
else:
return render_template('home/login.html', title='Log In', login_form=form)
маршрут входа
@bp.route ('/ logout')
def logout():
print("Logging out !!")
session.pop('_flashes', None)
logout_user()
return redirect(url_for('home.index'))
вход в систему html
@bp.route('/login', methods=['GET', 'POST'])
def login():
if current_user.is_authenticated:
if current_user.has_role(['Super Admin', 'Admin']):
return redirect(url_for('admin.admin_dash'))
if current_user.has_role(['Gym']):
return redirect(url_for('gym.gymmain'))
form = LoginForm()
if form.validate_on_submit():
print("FORM VALIDATED !!")
user = SuperUser.query.filter_by(email=form.email.data).first()
if user is None or not user.check_password(form.password.data):
flash('Invalid email or password')
return redirect(url_for('auth.login'))
login_user(user, remember=form.remember_me.data)
next_page = request.args.get('next')
if not next_page or url_parse(next_page).netloc != '':
if current_user.has_role(['Super Admin', 'Admin']):
next_page = url_for('admin.admin_dash')
if current_user.has_role(['Gym']):
next_page = url_for('gym.gymmain')
return redirect(next_page)
else:
return render_template('home/login.html', title='Log In', login_form=form)
app init
db = SQLAlchemy()
migrate = Migrate(compare_type=True)
login = LoginManager()
login.login_view = 'auth.login'
csrf = CsrfProtect()
def create_app(config_class=Config):
app = Flask(__name__)
app.config.from_object(config_class)
with app.app_context():
db.app = app
db.init_app(app)
migrate.init_app(app, db)
login.init_app(app)
csrf.init_app(app)