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
相关产品推荐
相关产品推荐

