1. 创建自定义用户模型

首先,创建一个自定义用户模型来保存用户的手机号码。在Django中,可以通过继承AbstractUser模型来实现这一功能,并添加一个phone_number字段来保存用户的手机号码。

from django.contrib.auth.models import AbstractUser
from django.db import models

class 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 CommonRequest

def 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 | http
    request.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 re

def 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 StrictRedis

def 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, redirect

class 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项目中实现用户注册和登录时的手机号验证功能。这不仅提高了安全性,也增强了用户体验。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部