#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