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

相关推荐
武子康8 分钟前
大数据-238 离线数仓 - 广告业务 Hive分析实战:ADS 点击率、购买率与 Top100 排名避坑
大数据·后端·apache hive
Victor3561 小时前
MongoDB(23) 如何使用条件查询文档?
后端
摸鱼的春哥1 小时前
Agent教程15:认识LangChain,Agent框架的王(上)
前端·javascript·后端
Victor3561 小时前
MongoDB(22)如何批量插入文档?
后端
追逐时光者8 小时前
一款使用 C# 编写专为 Windows 11 打造的文件资源管理器增强工具!
后端·.net
风象南9 小时前
普通人用AI加持赚到的第一个100块
人工智能·后端
冰_河11 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
JavaGuide13 小时前
7 道 RAG 基础概念知识点/面试题总结
前端·后端