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

Django集成Twilio SMS状态回调:非JSON格式数据的处理方案咨询

处理Twilio SMS状态回调的高效方法

嘿,这个问题我太懂了!你完全没必要写正则来折腾这个字符串——这其实是URL编码的表单数据(application/x-www-form-urlencoded格式),Python和Django都有现成的工具来解析,比正则靠谱、高效多了。


一、Django视图里的直接处理(最推荐)

因为Twilio的状态回调是POST请求,Django的request对象已经自动帮你解析了这种格式的请求体,你直接从request.POST里拿值就行,连字符串处理都省了:

from django.http import HttpResponse
from .models import SMSModel  # 假设你的短信模型叫SMSModel

def twilio_sms_status(request, sms_id):
    # 直接获取Twilio传递的状态数据
    sms_status = request.POST.get('SmsStatus')
    message_sid = request.POST.get('MessageSid')
    recipient_number = request.POST.get('To')
    
    # 更新数据库里的短信状态
    try:
        sms_obj = SMSModel.objects.get(id=sms_id)
        sms_obj.status = sms_status
        sms_obj.message_sid = message_sid  # 可以存下MessageSid方便后续查询
        sms_obj.save()
    except SMSModel.DoesNotExist:
        # 处理找不到对应短信的情况,比如返回404
        return HttpResponse(status=404)
    
    # 必须返回200响应给Twilio,不然它会重复发送回调请求
    return HttpResponse(status=200)

二、手动处理原始字符串(非Django场景)

如果是在其他Python环境里需要手动解析你拿到的那个长字符串,用urllib.parse里的parse_qs方法就行,专门用来解析这种URL编码的参数:

from urllib.parse import parse_qs

# 你拿到的Twilio返回的原始字符串
twilio_raw_str = 'SmsSid=SM3bceec02449e4a75a3c308e2befa6136&SmsStatus=sent&MessageStatus=sent&To=%2B19174003826&MessageSid=SM3bceec02449e4a75a3c308e2befa6136&AccountSid=////////&From=%2B19179244405&ApiVersion=2010-04-01'

# 先把HTML转义的&替换成&,Twilio有时候会这么传
decoded_str = twilio_raw_str.replace('&', '&')
# 解析成字典,注意每个值是列表(因为URL参数可能重复)
parsed_data = parse_qs(decoded_str)

# 提取需要的字段,取列表第一个元素即可
sms_status = parsed_data['SmsStatus'][0]
message_sid = parsed_data['MessageSid'][0]
recipient = parsed_data['To'][0]

为什么不用正则?

正则表达式很容易踩坑:比如参数顺序变化、参数值里出现特殊字符(比如&或者=,虽然Twilio会编码,但正则处理起来还是麻烦),而parse_qs和Django的request.POST都是专门针对这种URL编码格式开发的工具,经过了大量测试,稳定性和效率都比手写正则高得多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 00:17:38