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

Flask生成支付链接后,循环式支付跟踪无法返回链接至浏览器求助

问题根源

你的order_status是阻塞式循环函数,直接在Flask请求处理流程中调用会卡住当前请求线程,必须等循环结束才会返回响应,导致浏览器一直无法拿到支付链接。核心解决思路是把这个阻塞任务放到后台执行,不干扰请求响应的正常流程。

解决方案

方案1:用线程后台执行阻塞任务

用Python标准库threading把order_status放到单独线程运行,主线程可以直接返回支付链接:

from flask import request, jsonify
import threading
from functions import pmt_link, order_status  # 修正拼写错误:impprt → import

@app.route('/addToBasket', methods=['POST', 'GET'])
def basket_data():
    if request.method == "POST":
        data = request.get_json()
        action = data['action']
        if action == 'paymentLink':
            link = pmt_link(data)
            result = jsonify(link)
            # 启动后台线程执行order_status,daemon=True让线程随主程序退出
            threading.Thread(target=order_status, args=(data,), daemon=True).start()
        return result

方案2:适配异步版order_status(如果你用了asyncio)

如果order_status是用async定义的异步函数,需要在同步Flask环境里正确启动异步任务:

from flask import request, jsonify
import asyncio
from functions import pmt_link, order_status

@app.route('/addToBasket', methods=['POST', 'GET'])
def basket_data():
    if request.method == "POST":
        data = request.get_json()
        action = data['action']
        if action == 'paymentLink':
            link = pmt_link(data)
            result = jsonify(link)
            # 创建独立事件循环并启动异步任务
            loop = asyncio.new_event_loop()
            asyncio.set_event_loop(loop)
            loop.create_task(order_status(data))
            # 用线程运行事件循环,不阻塞主线程
            threading.Thread(target=loop.run_forever, daemon=True).start()
        return result
注意事项
  • 后台任务要做好异常捕获,避免任务崩溃影响主程序运行;
  • 如果order_status是长期运行的循环任务,推荐用专业任务队列(如Celery)管理,但线程方案足够解决当前阻塞响应的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 06:47:19