You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask API:如何在路由外的后台任务中访问并修改用户状态?

后台任务中更新用户状态失败的解决方案

问题场景

为实现轮询机制,使用ThreadPoolExecutor创建后台任务,同时在用户表中添加status布尔字段限制用户同一时间仅能发起一个请求。但后台任务结束时,无法在路由外将current_user.status修改为False,尝试通过user_id查询用户(user = User.query.get(user_id))仍未解决问题。

核心原因

后台任务运行在独立线程中,不在Flask的请求上下文范围内,无法直接复用请求内的数据库会话;且current_user仅在请求上下文里有效,直接操作会导致数据库会话异常或无法正确定位用户。

解决代码

修改后台任务函数,手动管理数据库会话,确保无论任务成功或失败,都重置用户状态:

from your_app import db  # 导入你的Flask-SQLAlchemy实例

def background_translation(file_content, w_model, transcription, model, pitch, speech_rate, user_id):
    try:
        srt_file = whisper_transcribe(file_content, w_model, transcription)
        audio = text_to_speech(srt_file, model, pitch, speech_rate)
        output = add_stream(audio, file_content)

        # 保存处理后的文件
        destination = os.path.join(CONTENT_FOLDER, f"{user_id}.mp4")
        shutil.move(output, destination)
        print(f"Translation complete: saved to {destination}")

    except Exception as e:
        print("BGT error during translation:", e)
    finally:
        # 无论任务成功失败,强制重置用户状态
        try:
            user = db.session.query(User).get(user_id)
            if user:
                user.status = False
                db.session.commit()
        except Exception as db_e:
            print("Failed to update user status:", db_e)
            db.session.rollback()

@bp.route('/translator', methods=['POST'])
@login_or_token_required
def translator(user):
    # 输入参数处理...

    user_id = current_user.id
    start_process(current_user)  # 此处应已将user.status设为True

    file_extension = secure_filename(filepath.filename)
    file_content = os.path.join(UPLOAD_FOLDER, file_extension)
    filepath.save(file_content)

    executor.submit(
        background_translation,
        file_content,
        w_model,
        transcription,
        model,
        pitch,
        speech_rate,
        user_id
    )

    return jsonify({"message": "Translation started"}), 200

关键说明

  • 独立数据库会话:后台任务中手动通过db.session.query获取用户,避免依赖请求上下文内的会话,保证线程安全。
  • finally块兜底:无论任务执行成功还是抛出异常,都会进入finally块重置用户状态,避免用户长期处于"处理中"状态。
  • 数据库异常处理:对数据库操作单独捕获异常并执行回滚,防止会话污染影响后续操作。

内容的提问来源于stack exchange,提问作者Alexandre Silkin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 21:59:53