如何在Django应用中集成Twilio实现新文章发布时给注册用户群发短信
实现方案
核心修改说明
- 修正原代码的缩进错误:
__str__、get_absolute_url、save方法需要缩进为Post类的成员方法 - 新增新建文章判断逻辑,仅首次创建文章时触发短信发送,避免后续更新文章重复推送
- 从
Profile表过滤出所有已登记有效手机号的用户,遍历调用Twilio接口完成群发 - 新增异常捕获逻辑,避免单个号码发送失败中断整个群发流程
修改后完整代码
from django.db import models from django.urls import reverse from django.conf import settings from twilio.rest import Client # 替换为你实际Profile模型的导入路径 from .models import Profile class Post(models.Model): title = models.CharField(max_length=100) content = models.TextField() detail_text = models.TextField(default='') def __str__(self): return self.title def get_absolute_url(self): return reverse('post-detail', kwargs={'pk': self.pk}) def save(self, *args, **kwargs): # 判断是否为首次新建的文章 is_new_post = self.pk is None # 先执行文章保存,确保入库成功后再发短信 super().save(*args, **kwargs) if is_new_post: account_sid = settings.TWILIO_ACCOUNT_SID auth_token = settings.TWILIO_AUTH_TOKEN client = Client(account_sid, auth_token) # 过滤出所有持有有效手机号的用户,替换phone为你Profile模型里的实际手机号字段名 valid_numbers = Profile.objects.exclude(phone__isnull=True).exclude(phone__exact='').values_list('phone', flat=True) sms_content = f'Hello, 新文章《{self.title}》已上线,可前往dashboard查看。' for recipient in valid_numbers: if not recipient: continue try: message = client.messages.create( body=sms_content, from_=settings.TWILIO_NUMBER, to=recipient ) print(f"发送成功,SID:{message.sid},接收号码:{recipient}") except Exception as e: print(f"发送失败,接收号码:{recipient},错误信息:{str(e)}")
注意事项
- 代码中的
phone字段需要替换为你Profile模型里实际存储手机号的字段名 - 所有手机号需要符合Twilio格式要求,必须携带国家码,例如中国手机号格式为
+8613xxxxxxxxx - 如果用户量较大,直接在
save方法里循环发送短信会阻塞文章保存请求,建议后续引入Celery等异步任务框架处理短信发送逻辑 - 注意遵守Twilio的发送频率限制,避免触发平台限流
内容的提问来源于stack exchange,提问作者tede95
相关产品推荐
相关产品推荐

