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

相关推荐
2401_891409262 小时前
量化数据13:港股分钟K线、Level2逐笔Tick、十档盘口和港股通历史数据的批量提取
数据库
实名上网宋凯宣8 小时前
Django
后端·python·django
w-w0w-w8 小时前
SQL注入
网络·数据库·sql
tianyuanwo8 小时前
NetBox 数据库详解:当“关系型数据库”被装进一个网络运维的领域模型里
运维·数据库·netbox
一条泥憨鱼8 小时前
【计算机网络】短连接、长连接与连接池:从 TCP 握手到池化复用的完整链路
网络·数据库·网络协议·tcp/ip·计算机网络
我不会起名字3228 小时前
Redis 从 0 到 1(十七):订单 30 分钟不支付自动关闭——ZSet 延迟队列 Go 实现
redis·go·延迟队列·zset·订单
IvorySQL9 小时前
深入 PostgreSQL WAL:从崩溃恢复到逻辑复制
数据库·postgresql
利威尔xu9 小时前
Go IM 源码实战(14):本地缓存快 3000 倍,失效却难 10 倍
后端·缓存·微服务·面试·golang
逃逸线LOF10 小时前
Ribbon负载均衡原理(Irule组件、源码分析)
后端·spring cloud·ribbon
幽灵诶10 小时前
Mysql(基于测试的学习)
数据库·mysql