Как правильно списать баланс пользователя с помощью Python FastAPIPython

Программы на Python
Ответить
Anonymous
 Как правильно списать баланс пользователя с помощью Python FastAPI

Сообщение Anonymous »

У меня есть серверное приложение FastAPI, в котором я обслуживаю несколько API, каждый API будет стоить пользователю 10 кредитов. Я хочу вычесть баланс пользователя только в том случае, если вызов API прошел успешно (без ошибок). Вот моя первая конечная точка API:

Код: Выделить всё

@router.post("/")
async def process_one(current_user = Depends(get_current_user),
db_session: Session = Depends(get_db_session)):
try:
if current_user.credits < 10:
raise HTTPException(status_code=400, detail="Insufficient credits")
current_user.credits -= 10
db_session.flush()
time.sleep(300) # some processing that will take 2-3 minutes

db_session.commit() # no error so commit to database
return {"status", "success"}
except Exception as e:
raise HTTPException(status_code=500, detail="Internal Server Error")
Это работает нормально, однако обработка этого API занимает 2–3 минуты. Допустим, у пользователя есть только 10 кредитов, и он вызывает этот API, так как этот API займет 2-3 минуты, пользователь может напрямую вызвать другой API, который завершит обработку через 1 секунду, и система позволит это, поскольку первый API имеет еще не зафиксировал вывод в базу данных, как решить эту проблему?
ChatGPT предложил заблокировать запись пользователя, но я не думаю, что это правильное решение, поскольку пользователь не сможет позвони в любой другой API (поскольку все API будут вычитать кредиты пользователей, чтобы они могли делать обновления, но запись заблокирована).

Подробнее здесь: https://stackoverflow.com/questions/785 ... on-fastapi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»