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

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运行,稳定性更高。步骤如下:

  1. 在你的app目录下创建如下文件夹结构(没有的话新建):

    your_app/
        management/
            __init__.py
            commands/
                __init__.py
                send_wedding_sms.py
    
  2. 在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}条短信"))
    
  3. 运行命令:
    在项目根目录下执行:

    python manage.py send_wedding_sms
    

这种方法的好处是:自带错误提示样式,能直接用Django的配置和日志,以后维护起来也更方便。

总之,不管用哪种方法,核心都是让你的代码在Django环境加载完成后再访问模型。按照上面的步骤改,应该就能解决这个错误啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:00:44