-
Notifications
You must be signed in to change notification settings - Fork 13
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Исправить ошибку InvalidRequestError при регистрации / обновлении данных пользователя #468
Comments
А как вообще протестить этот момент? Я закомментил await self._session.commit(), но при каких действиях будет всплывать ошибка? |
Update по заданию: |
Чтобы получить эту ошибку, нужно зарегистрировать нового пользователя (вызвать эндпоинт и перейти с id_hash в бот). По коду это можно посмотреть здесь:
|
Это я делал. И ошибки не вижу.
|
Изменила код также, как у тебя, и получилось повторить ошибку. Нужно:
В результате бот не отобразит никакого сообщения вообще и в терминале отобразится ошибка. |
Как работает http://127.0.0.1:8000/docs#/ExternalSiteUser/external_user_registration_api_auth_external_user_registration_post? Насколько я понял, мне нужны а) пользователь и б) его |
Для своей локальной БД ты эти данные просто придумываешь. Можешь передать в теле запроса такое:
moderation_status равен NEW_VOL, т.к. это одно из возможных значений, которое принимает эндпоинт. Проверить, что пользователь зарегистрировался можно через DBeaver. Должна появиться запись в таблице external_site_users. |
...
telegram_id = telegram_user.id
user = await self._user_repository.get_by_external_id(ext_site_user.id)
user_by_telegram_id = await self._user_repository.get_by_telegram_id(telegram_id)
# `do_update_or_create` все равно становится True и в новой реализации нигде не нужен
# Проверку `telegram_id` можно сделать через and
# else пропадает вообще, потому что в if и в else тот же функционал, что касается `user` и `do_update_or_create`
if user and user.telegram_id != telegram_id:
await self._update_or_create(user, external_id=None)
# А раз `do_update_or_create = True`, то if тоже пропадает
user = await self._update_or_create(
user_by_telegram_id, # вместо user, который создается через user = user_by_telegram_id
...
)
# В остальном все так же Если добро, сделаю две ветки и создам 2 pr'а |
Аааа, вот оно как! Да, пропустил этот момент, спасибо! Впредь буду внимательнее |
Ошибка
InvalidRequestError: A transaction is already begun on this Session
возникает при использовании set_categories_to_user в UserRepository при попытке создать новую сессию в строке 63 (async with self._session.begin() as transaction:
).Сейчас для обхода этой ошибки при необходимости используется добавление
await self._session.commit()
перед этой строкой.Данная функция используется при получении данных о пользователе внешнего сайта external_site_user (первично и при обновлении) и при привязке пользователя user к пользователю внешнего сайта external_site_user.
Идея в том, чтобы добавление категорий пользователю происходило в рамках отдельной транзакции (всё либо ничего). Отдельную транзакцию попросили добавить в рамках этого PR.
Нужно разобраться, как правильно создавать транзакцию, чтобы не пришлось использовать костыль с добавлением
await self._session.commit()
. О транзакциях в sqlalchemy.ext.asyncio можно почитать здесь.В классе ContentService есть actualize_objects, где применяется конструкция
async with self._session as session:
. Возможно такой вариант решения тоже подойдет.Where:
src/core/db/repository/user.py
The text was updated successfully, but these errors were encountered: