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

相关推荐
岁岁种桃花儿5 小时前
MySQL从入门到精通系列:InnoDB记录存储结构
数据库·mysql
jiunian_cn7 小时前
【Redis】hash数据类型相关指令
数据库·redis·哈希算法
冉冰学姐7 小时前
SSM在线影评网站平台82ap4(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm框架·在线影评平台·影片分类
Exquisite.8 小时前
企业高性能web服务器(4)
运维·服务器·前端·网络·mysql
知识分享小能手8 小时前
SQL Server 2019入门学习教程,从入门到精通,SQL Server 2019数据库的操作(2)
数据库·学习·sqlserver
踩坑小念9 小时前
秒杀场景下如何处理redis扣除状态不一致问题
数据库·redis·分布式·缓存·秒杀
索荣荣9 小时前
Java Session 全面指南:原理、应用与实践(含 Spring Boot 实战)
java·spring boot·后端
萧曵 丶10 小时前
MySQL 语句书写顺序与执行顺序对比速记表
数据库·mysql
Wiktok10 小时前
MySQL的常用数据类型
数据库·mysql
千寻技术帮10 小时前
10333_基于SpringBoot的家电进存销系统
java·spring boot·后端·源码·项目·家电进存销