Я видел другие вопросы, поэтому собираюсь сразу перейти к сути.
Мой сайт - это блог, созданный с flask, поэтому, конечно, я выполняю такие операции, как обновление информации о пользователе, добавление новой загруженные файлы et c.
Я всегда выполнял эти операции, используя app.db
, но иногда я получаю ошибку в названии, обычно после нескольких минут бездействия.
Посмотрев на другие вопросы, которые я обнаружил, что лучший способ справиться с этим - использовать contextmanager session_scope()
, как показано здесь:
@contextmanager
def session_scope():
"""Provide a transactional scope around a series of operations."""
session = db.Session()
try:
yield session
session.commit()
except:
session.rollback()
raise
finally:
session.close()
В чем я не уверен, так это где я должен использовать это session_scope()
. Например, здесь я обновляю биографию пользователей (description
), когда данные отправляются через ajax (это работает нормально):
description = content['description']
description = (description[:max_characters_allowed_bio]) \
if len(description) > max_characters_allowed_bio else description
if current_user.description.split() != description.split():
current_user.description = description
db.session.commit()
Теперь, если я прав, я должен использовать session_scope
, так как я делаю операции с базой данных, однако я попытался это безуспешно:
with session_scope() as session:
description = content['description']
description = (description[:max_characters_allowed_bio]) \
if len(description) > max_characters_allowed_bio else description
if current_user.description.split() != description.split():
session.query(User).filter_by(id=current_user.id).description = description
session.commit()
Как мне обновить эту информацию через session_scope
?
И опять же, я должен использовать session_scope
только при фиксации? Или мне нужно использовать его для других подобных запросов?
Work.query.get_or_404(work_id)
Media.query.filter(Media.path.contains(path)).first().id