Django项目 | 实现用户注册和登录时的手机号验证

1. 创建自定义用户模型

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

python 复制代码
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的设置文件中配置自定义用户模型。

python 复制代码
AUTH_USER_MODEL = 'your_app.CustomUser'

3. 发送短信验证码

使用第三方服务(如阿里云短信服务)来发送短信验证码。以下是使用阿里云短信服务发送验证码的示例代码:

python 复制代码
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开头等)。

python 复制代码
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或数据库),并在用户提交验证码时进行验证。

python 复制代码
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的视图和表单中集成上述逻辑,处理用户注册和登录时的手机号验证。

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

相关推荐
彭于晏Yan9 分钟前
OkHttp 与 RestTemplate 技术选型对比
java·spring boot·后端·okhttp
woniu_buhui_fei13 分钟前
工作中常用的注解梳理
后端
金銀銅鐵19 分钟前
[Java] 如何理解 class 文件中字段的 descriptor?
java·后端
钝挫力PROGRAMER23 分钟前
实战经验:如何修复 MariaDB 因 InnoDB 损坏导致的启动失败 (status=6/ABRT)
数据库·mariadb
我是一颗柠檬23 分钟前
【MySQL全面教学】MySQL基础与环境搭建Day1(2026年)
数据库·后端·sql·mysql·database
我是一颗柠檬23 分钟前
【MySQL全面教学】MySQL数据类型详解Day2(2026年)
数据库·后端·sql·mysql·database
一只fish26 分钟前
Oracle官方文档翻译《Database Concepts 26ai》第10章-SQL
数据库·oracle
怒放吧德德27 分钟前
JDK 版本一键切换工具(windows)
后端·shell
jnrjian33 分钟前
export partition 的par file
数据库·oracle
空中海38 分钟前
Redis知识图谱和回顾
数据库·redis·知识图谱