Колба-пользователи, вошедшие в систему под именем другого пользователя

#python #flask #gunicorn #production #flask-login

Вопрос:

Когда пользователь входит в систему, current_user показывает, что вошел другой пользователь. Это происходит на производстве. Я попытался выполнить отладку, распечатав идентификатор и имя текущего пользователя, и после добавления app.logger правильный пользователь отображается при входе пользователя, но когда я удаляю app.logger, он возвращается к той же проблеме. В чем здесь может быть проблема? Может быть, кэширование?

Ниже приведен маршрут, на который перенаправляется после входа в систему.

 @admin.route('/website',methods=['POST','GET'])
@login_required
def website():
    page = 'Dashboard'
    form = ContentForm()

    #for debbuging on gunicorn
    print(f'current user id is {current_user.id}')
    print(f'current user name is {current_user.name}')

    if request.method == 'POST':
        if form.validate():
            #some code here
            return 'ok'
        return jsonify(form.errors), 400

    return render_template('admin/website.html',page=page,form=form)

@admin.route('/login',methods=['GET','POST'])
def login():
    if current_user.is_authenticated:
        return redirect(url_for('admin.website'))

    form = LoginForm()
    redirect_url = '/website'
    res = 'Invalid email or password'

    if form.validate():
        admin = User.query.filter_by(email=form.email.data).first()

        if admin and check_password_hash(admin.password, form.password.data):
            login_user(admin)
            return jsonify(redirect_url)

        return jsonify(res), 400

    return render_template('admin/login.html', form=form)
 

и код входа в систему ajax

 const login_form = document.getElementById('login_form')
const error = document.getElementById('error-message')

const fields = {

    csrf_token: {
            input: document.getElementById('csrf_token'),
            error: document.getElementById('csrf_token-error')  
          },

    name: {
        input: document.getElementById('name'),
        error: document.getElementById('name-error')
    },

    email: {
        input: document.getElementById('email'),
        error: document.getElementById('email-error')
    },

    password: {
        input: document.getElementById('password'),
        error: document.getElementById('password-error')
    }
}

if(login_form){

login_form.addEventListener('submit', async (e) => {
 e.preventDefault()

 const response = await fetch('/login', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({

    csrf_token: fields.csrf_token.input.value,
    email: fields.email.input.value,
    password: fields.password.input.value })

 })
 
 if(response.ok){

  const res = await response.json()
  window.location.replace(res)

 }
 else {
    
  error.setAttribute('class','bg-red-200 px-3 py-2 rounded-lg mb-3 text-red-900')
  error.innerHTML = await response.json()
  login_form.reset()

 }

})

} 
 

Добавлено app.logging.info для отладки

 from app import create_app
import logging

app = create_app()

if __name__ == "__main__":
    app.run()
else:
    app.logger.info('This is an INFO message')
 

Колба-логин

 from app.models import User

@login_manager.user_loader
def load_user(user_id): 

    return User.query.get(user_id)
 

Я использую Gunicorn в качестве рабочего сервера.

Ответ №1:

Я могу подтвердить, что причина, по которой пользователи входили в систему, как и другие пользователи, была связана с кэшированием, и я решил ее, добавив следующее:

 @admin.after_request
def add_header(response):
    response.headers["Cache-Control"] = "no-store, max-age=0"
    return response