Django集成Twilio发送SMS遇AppRegistryNotReady错误求助
解决Django中AppRegistryNotReady错误,给所有宾客发送Twilio短信
嘿,我刚看完你的问题,这个AppRegistryNotReady错误其实是新手用Django操作模型时很常见的坑——你直接运行的脚本没加载Django的环境,所以它根本不知道你的SmsUser模型在哪!
单独的send_sms.py不需要访问Django数据库,所以能正常发短信,但一旦要读取SmsUser数据,必须先让Django初始化它的应用注册表。下面给你两种靠谱的解决方法,选哪个都行:
方法1:在脚本里手动初始化Django环境
修改你的短信发送脚本,在开头加上Django的初始化代码,这样脚本就能识别你的模型了。示例代码如下(记得替换成你自己的项目和app名称):
import os import django from twilio.rest import Client # 替换成你的app名称,比如wedding_app.models from your_app.models import SmsUser # 第一步:告诉Django用哪个配置文件 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project_name.settings') # 第二步:初始化Django环境 django.setup() # 从Django配置里取Twilio凭证(别硬编码!) from django.conf import settings client = Client(settings.TWILIO_ACCOUNT_SID, settings.TWILIO_AUTH_TOKEN) def send_to_all_guests(): # 现在就能正常读取SmsUser了 all_guests = SmsUser.objects.all() for guest in all_guests: # 确保手机号是国际格式,比如中国号要+86开头 try: message = client.messages.create( body=f"嗨 {guest.name}!诚挚邀请你参加我们的婚礼,不见不散!", from_=settings.TWILIO_PHONE_NUMBER, to=guest.phone_number ) print(f"已给{guest.name}发送短信,SID: {message.sid}") except Exception as e: print(f"给{guest.name}发送失败:{str(e)}") if __name__ == "__main__": send_to_all_guests()
小提醒:
- 把Twilio的
ACCOUNT_SID、AUTH_TOKEN、PHONE_NUMBER放到Django的settings.py里,用环境变量加载更安全,比如在settings.py里加:import os TWILIO_ACCOUNT_SID = os.getenv("TWILIO_ACCOUNT_SID") TWILIO_AUTH_TOKEN = os.getenv("TWILIO_AUTH_TOKEN") TWILIO_PHONE_NUMBER = os.getenv("TWILIO_PHONE_NUMBER") - 检查数据库里的手机号格式,Twilio要求国际标准格式(比如
+86138xxxxxxx),格式不对会发送失败。
方法2:用Django自定义管理命令(更推荐)
这种方法更符合Django的开发规范,不用手动初始化环境,直接通过manage.py运行,稳定性更高。步骤如下:
在你的app目录下创建如下文件夹结构(没有的话新建):
your_app/ management/ __init__.py commands/ __init__.py send_wedding_sms.py在
send_wedding_sms.py里写命令代码:from django.core.management.base import BaseCommand from twilio.rest import Client from django.conf import settings from your_app.models import SmsUser class Command(BaseCommand): # 命令的帮助说明,运行python manage.py help send_wedding_sms能看到 help = "给数据库里所有宾客发送婚礼邀请短信" def handle(self, *args, **options): client = Client(settings.TWILIO_ACCOUNT_SID, settings.TWILIO_AUTH_TOKEN) success_count = 0 all_guests = SmsUser.objects.all() for guest in all_guests: try: message = client.messages.create( body=f"嗨 {guest.name}!我们的婚礼将于xxxx年xx月xx日在xxxx举办,期待你的到来!", from_=settings.TWILIO_PHONE_NUMBER, to=guest.phone_number ) # 用Django自带的样式输出成功信息 self.stdout.write(self.style.SUCCESS(f"✅ 成功发送给{guest.name},短信SID: {message.sid}")) success_count += 1 except Exception as e: self.stdout.write(self.style.ERROR(f"❌ 给{guest.name}发送失败:{str(e)}")) self.stdout.write(self.style.SUCCESS(f"\n🎉 任务完成!共成功发送{success_count}条短信"))运行命令:
在项目根目录下执行:python manage.py send_wedding_sms
这种方法的好处是:自带错误提示样式,能直接用Django的配置和日志,以后维护起来也更方便。
总之,不管用哪种方法,核心都是让你的代码在Django环境加载完成后再访问模型。按照上面的步骤改,应该就能解决这个错误啦!
内容的提问来源于stack exchange,提问作者Gary
相关产品推荐
相关产品推荐

