Flask 登录用户显示为另一个用户登录

问题描述 投票:0回答:2

当用户登录时,current_user 似乎显示另一个用户是登录的用户。这发生在生产中。我尝试通过打印 current_user id 和名称进行调试,在添加 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 作为服务器。

python flask gunicorn flask-login
2个回答
0
投票

我可以确认用户看起来像其他用户一样登录的原因是因为缓存,我通过添加以下内容解决了这个问题:

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

-1
投票

你能告诉你把代码放在哪里吗? @admin.after_request def add_header(响应): response.headers["Cache-Control"] = "no-store, max-age=0" 返回响应

我有同样的问题,但不知道你把代码放在哪里

我不能发表评论,因为我没有足够的信誉,请不要投反对票

© www.soinside.com 2019 - 2024. All rights reserved.