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三个变量均未提前赋值,运行会直接抛出名称错误
按以下步骤修改即可实现需求:
- 先安装必要依赖
pip install flask twilio - 替换为如下可运行代码
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
相关产品推荐
相关产品推荐

