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.
|
|
|
|
import typing
|
|
|
|
|
from datetime import timedelta
|
|
|
|
|
|
|
|
|
|
from django.core.cache import cache
|
|
|
|
|
|
|
|
|
|
from djangoblog.utils import send_email
|
|
|
|
|
|
|
|
|
|
_code_ttl = timedelta(minutes=5)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def send_verify_email(to_mail: str, code: str, subject: str = "邮件验证码"):
|
|
|
|
|
"""发送重设密码验证码
|
|
|
|
|
Args:
|
|
|
|
|
to_mail: 接受邮箱
|
|
|
|
|
subject: 邮件主题
|
|
|
|
|
code: 验证码
|
|
|
|
|
"""
|
|
|
|
|
html_content = f"您正在重设密码,验证码为:{code}, 5分钟内有效,请妥善保管"
|
|
|
|
|
send_email([to_mail], subject, html_content)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def verify(email: str, code: str) -> typing.Optional[str]:
|
|
|
|
|
"""验证code是否有效
|
|
|
|
|
Args:
|
|
|
|
|
email: 请求邮箱
|
|
|
|
|
code: 验证码
|
|
|
|
|
Return:
|
|
|
|
|
如果有错误就返回错误str
|
|
|
|
|
Node:
|
|
|
|
|
这里的错误处理不太合理,应该采用raise抛出
|
|
|
|
|
否测调用方也需要对error进行处理
|
|
|
|
|
"""
|
|
|
|
|
cache_code = get_code(email)
|
|
|
|
|
if cache_code != code:
|
|
|
|
|
return "验证码错误"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def set_code(email: str, code: str):
|
|
|
|
|
"""设置code"""
|
|
|
|
|
cache.set(email, code, _code_ttl.seconds)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_code(email: str) -> typing.Optional[str]:
|
|
|
|
|
"""获取code"""
|
|
|
|
|
return cache.get(email)
|