You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
# 导入类型提示模块
import typing
# 导入时间间隔类
from datetime import timedelta
# 导入Django缓存框架
from django . core . cache import cache
# 导入国际化翻译函数
from django . utils . translation import gettext
# 导入延迟翻译函数
from django . utils . translation import gettext_lazy as _
# 导入发送邮件的工具函数
from djangoblog . utils import send_email
# 验证码有效期: 5分钟
_code_ttl = timedelta ( minutes = 5 )
def send_verify_email ( to_mail : str , code : str , subject : str = _ ( " Verify Email " ) ) :
""" 发送验证邮件,用于密码重置等场景
Args:
to_mail: 接收邮件的邮箱地址
subject: 邮件主题,默认为 " 验证邮箱 "
code: 验证码内容
"""
# 构建邮件HTML内容, 包含验证码信息
html_content = _ (
# 翻译文本:您正在重置密码,验证码是:{code}, 5分钟内有效, 请妥善保管
" You are resetting the password, the verification code is: %(code)s , valid within 5 minutes, please keep it "
" properly "
) % { ' code ' : code } # 将code插入到格式化字符串中
# 调用发送邮件函数
send_email ( [ to_mail ] , subject , html_content )
def verify ( email : str , code : str ) - > typing . Optional [ str ] :
""" 验证验证码是否有效
Args:
email: 请求验证的邮箱地址
code: 用户输入的验证码
Return:
如果验证失败返回错误信息字符串, 验证成功返回None
Note:
这里的错误处理不太合理, 应该采用raise抛出异常
否则调用方也需要对error进行处理
"""
# 从缓存中获取该邮箱对应的验证码
cache_code = get_code ( email )
# 比较缓存中的验证码和用户输入的验证码
if cache_code != code :
# 如果不匹配,返回错误信息
return gettext ( " Verification code error " )
# 验证成功, 返回None
def set_code ( email : str , code : str ) :
""" 将验证码设置到缓存中 """
# 使用cache.set方法, key为邮箱, value为验证码, 设置过期时间
cache . set ( email , code , _code_ttl . seconds )
def get_code ( email : str ) - > typing . Optional [ str ] :
""" 从缓存中获取验证码 """
# 使用cache.get方法, 根据邮箱获取验证码
return cache . get ( email )