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

Django项目诊所预约功能点击后发送短信通知的实现方法

Django实现预约触发短信通知功能实现指导

1. 前期准备:开通短信服务

  • 选择合适的短信服务商,完成企业认证、短信签名、短信模板的申请,获取服务商提供的API密钥、模板ID等核心参数
  • 提前确认诊所预留的手机号格式符合短信服务商的发送要求,避免发送失败

2. 配置项目参数

把短信相关的敏感参数写入项目settings.py统一管理,不要硬编码在业务代码中:

# settings.py 追加配置
SMS_ACCESS_KEY = "你的服务商AccessKey"
SMS_SECRET = "你的服务商Secret"
SMS_SIGN_NAME = "你的短信签名"
SMS_APPOINTMENT_TEMPLATE_ID = "预约通知模板ID"

3. 封装短信发送工具函数

在项目下新建utils/sms.py文件,封装通用的短信发送逻辑:

from django.conf import settings
# 导入对应短信服务商的官方SDK

def send_appointment_sms(phone, clinic_name, patient_name, appointment_time):
    """
    发送预约通知短信给诊所
    :param phone: 诊所联系手机号
    :param clinic_name: 诊所名称
    :param patient_name: 预约患者姓名
    :param appointment_time: 预约时间
    :return: 发送是否成功
    """
    # 按照对应服务商SDK要求构造请求参数,替换模板变量
    template_params = {
        "clinic_name": clinic_name,
        "patient_name": patient_name,
        "time": appointment_time.strftime("%Y-%m-%d %H:%M")
    }
    # 调用服务商发送接口,可直接参考对应服务商的Python接入文档实现调用逻辑
    try:
        # 服务商接口调用逻辑
        return True
    except Exception as e:
        # 记录发送错误日志
        print(f"短信发送失败:{e}")
        return False

4. 编写预约业务视图

在对应app的views.py中编写预约接口,增加登录校验,完成预约记录创建和短信触发:

from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404, redirect
from django.contrib import messages
from .models import Clinic, Patient
from .utils.sms import send_appointment_sms

@login_required
def book_appointment(request, clinic_id):
    # 获取要预约的诊所对象
    clinic = get_object_or_404(Clinic, id=clinic_id)
    # 创建预约记录,患者信息可从当前登录用户的关联信息中获取
    appointment = Patient.objects.create(
        clinic=clinic,
        patient_name=request.user.full_name, # 替换为你用户模型中对应的姓名字段
        contact_no=request.user.mobile # 替换为你用户模型中对应的手机号字段
        # 如果你允许用户自行选择预约时间,可从请求参数中获取时间传入,不要用auto_now
    )
    # 触发短信发送
    if clinic.contact_no:
        send_res = send_appointment_sms(
            phone=clinic.contact_no,
            clinic_name=clinic.clinic_name,
            patient_name=appointment.patient_name,
            appointment_time=appointment.appointment_time
        )
        if send_res:
            messages.success(request, "预约成功,已通知诊所")
        else:
            messages.warning(request, "预约成功,但短信通知发送失败,请稍后联系诊所确认")
    else:
        messages.warning(request, "预约成功,该诊所未预留联系电话,无法发送通知")
    return redirect("诊所列表页的路由名") # 预约完成后跳转回诊所列表

5. 配置路由与前端按钮

  • 在urls.py中新增路由配置:
urlpatterns = [
    # 其他原有路由
    path('book/<int:clinic_id>/', views.book_appointment, name='book_appointment'),
]
  • 前端诊所卡片的预约按钮链接绑定对应路由,示例:
<a href="{% url 'book_appointment' clinic.id %}" class="btn btn-primary">预约就诊</a>

优化建议

  • 建议修改Patient模型的appointment_time字段属性,当前auto_now=True会在每次修改记录时自动更新时间,如果你要存储的是预约提交时间,建议改为auto_now_add=True;如果允许用户选择预约时间,去掉auto_now属性,提交时由用户传入时间
  • 短信发送属于IO密集型操作,建议使用Celery等异步任务框架处理,避免接口阻塞影响用户体验
  • 可以使用Django信号post_save监听Patient模型的创建事件,自动触发短信发送,实现业务逻辑解耦
  • 增加短信发送频率限制,避免恶意请求消耗短信额度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 09:06:01