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

Flask如何提取POST请求参数并根据值重定向或挂断通话

修正方案

你原有代码存在4个核心问题,直接导致运行不符合预期:

  • 参数获取方法错误:Twilio发送的POST请求为application/x-www-form-urlencoded格式,Flask会自动将表单字段解析到request.form对象中,request.get_data()仅能获取原始请求字节流,无法直接读取单个字段值,且该方法传入字段名的用法本身就是错的
  • Python语法错误:else关键字后不能直接跟判断条件,多分支判断需使用elif
  • 逻辑适配错误:Twilio通话流程不识别普通HTTP 3xx跳转,所有通话控制动作(挂断、转流程、放音等)都需要返回标准TwiML格式指令才能生效
  • 变量未定义:原代码中human、machine_start、resp三个变量均未提前赋值,运行会直接抛出名称错误

按以下步骤修改即可实现需求:

  1. 先安装必要依赖
    pip install flask twilio
  2. 替换为如下可运行代码
from flask import Flask, request, url_for
from twilio.twiml.voice_response import VoiceResponse

app = Flask(__name__)

# 定义AnsweredBy字段匹配常量
ANSWER_TYPE_HUMAN = "human"
ANSWER_TYPE_MACHINE = "machine_start"

@app.route("/recieve", methods=['GET', 'POST'])
def recieve():
    # 读取POST表单中的AnsweredBy字段,默认值为空字符串
    answered_by = request.form.get("AnsweredBy", "")
    resp = VoiceResponse()

    if answered_by == ANSWER_TYPE_HUMAN:
        # 真人接听场景:返回TwiML的Redirect指令,让Twilio请求/main路由的逻辑
        resp.redirect(url_for("main", _external=True))
        return str(resp)
    elif answered_by == ANSWER_TYPE_MACHINE:
        # 答录机接听场景:返回挂断指令直接终止通话
        resp.hangup()
        return str(resp)
    else:
        # 其他异常场景默认挂断
        resp.hangup()
        return str(resp)

@app.route("/main", methods=['GET', 'POST'])
def main():
    # 此处写真人接听后要执行的通话逻辑,比如放音、转人工、采集按键输入等
    resp = VoiceResponse()
    resp.say("您好,欢迎致电,正在为您转接人工坐席。")
    # 后续逻辑自行补充
    return str(resp)

if __name__ == "__main__":
    app.run(port=5000, debug=True)

注意事项

  • 不要给Twilio返回普通HTTP 302跳转,Twilio不会像浏览器一样自动跟随跳转,必须返回带<Redirect>节点的TwiML才能触发路由转发
  • 用ngrok做内网穿透时,需要将Twilio控制台对应号码的语音回调地址设置为ngrok分配的公网域名+/recieve路径,请求方法选择HTTP POST
  • 如果需要服务端内部直接调用其他路由逻辑而不经过Twilio二次请求,可以直接在分支里return main(),但Twilio场景下推荐用TwiML Redirect的方式,方便后续日志排查和流程拆分

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:24:09