Я использую Flask -Security для управления аутентификацией пользователя для веб-приложения в App Engine. Для базы данных пользователей с Flask -Security я использую Cloud SQL. По некоторым причинам, когда он читает из БД, он иногда читает пользователей, которые были удалены, или пропускает некоторых пользователей, которые там находятся. Например, если в базе данных есть пользователи A, B и C, и я удаляю пользователя C, даже тогда C будет прочитано. Или, если я создаю пользователя D, D не будет считываться из базы данных.
Это мой код для чтения из базы данных и возврата всех пользователей, кроме того, который зарегистрирован в данный момент.
def get_users():
users = User.query.all()
user_data = list()
for user in users:
elem = dict()
if user.id == int(session['user_id']):
continue
elem['name'] = user.name
elem['email'] = user.email
elem['role'] = user.roles[0].name
elem['language_pref'] = user.language_pref
user_data.append(elem)
return user_data
После удаления или создания пользователя я экспортировал данные из облака SQL, чтобы проверить, был ли пользователь успешно удален / создан, и обнаружил, что обе функции работают правильно.
Настройки Flask -Security точно такие же, как описано здесь , за исключением объекта механизма в database.py. Код объекта движка:
engine = create_engine(
engine.url.URL(
drivername='mysql+pymysql',
username="USER",
password="PASSWORD",
database='userdb',
query={
'unix_socket': '/cloudsql/{}'.format("INSTANCE_CONNECTION_NAME")
}
),
)
Вышеуказанная ошибка возникает только при запуске приложения на App Engine. Если я запускаю его локально с облачным прокси sql, он работает отлично. И если я отключаю и перезапускаю приложение, оно снова правильно читает базу данных, пока я не добавлю или не удаляю пользователя, а затем снова начнет показывать старые данные.
Я предположил, что это была какая-то проблема с кэшированием, а в этот вопрос, один из ответов, который сказал, чтобы установить уровень изоляции "ЧИТАТЬ НЕОБЕСПЕЧЕННЫЙ", который работал для меня. Но я не понимаю, почему я должен установить уровень изоляции «ЧИТАТЬ НЕОБЕСПЕЧЕННЫЙ», чтобы он работал правильно, даже если все данные правильно зафиксированы.
Может кто-нибудь объяснить мне, почему это происходит?