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

