1. 创建自定义用户模型
首先,创建一个自定义用户模型来保存用户的手机号码。在Django中,可以通过继承AbstractUser
模型来实现这一功能,并添加一个phone_number
字段来保存用户的手机号码。
from django.contrib.auth.models import AbstractUser
from django.db import modelsclass CustomUser(AbstractUser):phone_number = models.CharField(max_length=15, unique=True)
2. 更新设置文件
在Django的设置文件中配置自定义用户模型。
AUTH_USER_MODEL = 'your_app.CustomUser'
3. 发送短信验证码
使用第三方服务(如阿里云短信服务)来发送短信验证码。以下是使用阿里云短信服务发送验证码的示例代码:
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequestdef send_sms(phone, code):client = AcsClient('your-access-key-id', 'your-access-key-secret', 'cn-hangzhou')request = CommonRequest()request.set_accept_format('json')request.set_domain('dysmsapi.aliyuncs.com')request.set_method('POST')request.set_protocol_type('https') # https | httprequest.set_version('2017-05-25')request.set_action_name('SendSms')request.add_query_param('RegionId', 'cn-hangzhou')request.add_query_param('PhoneNumbers', phone)request.add_query_param('SignName', 'YourSignName')request.add_query_param('TemplateCode', 'YourTemplateCode')request.add_query_param('TemplateParam', '{"code": "' + code + '"}')response = client.do_action(request)return str(response, encoding='utf-8')
4. 验证手机号码
在用户注册和登录时,验证手机号码的有效性。可以通过正则表达式来验证手机号码是否符合规则(例如:11位数字,以13、14、15、17、18开头等)。
import redef validate_mobile_number(phone_number):pattern = re.compile(r"^1[3-9]\d{9}$")return pattern.match(phone_number) is not None
5. 存储和验证短信验证码
在发送短信验证码后,需要将验证码存储在服务器端(如Redis或数据库),并在用户提交验证码时进行验证。
from redis import StrictRedisdef store_and_validate_code(phone, code):sr = StrictRedis(decode_responses=True)sr.setex(phone, 300, code) # 存储验证码,有效期5分钟return sr.get(phone) == code
6. 集成到视图和表单
在Django的视图和表单中集成上述逻辑,处理用户注册和登录时的手机号验证。
from django import forms
from django.shortcuts import render, redirectclass RegisterForm(forms.Form):phone_number = forms.CharField(max_length=15)password = forms.CharField(widget=forms.PasswordInput)code = forms.CharField(max_length=6)def clean_code(self):phone = self.cleaned_data.get('phone_number')code = self.cleaned_data.get('code')if not store_and_validate_code(phone, code):raise forms.ValidationError("验证码错误")return code
通过这些步骤,可以在Django项目中实现用户注册和登录时的手机号验证功能。这不仅提高了安全性,也增强了用户体验。