TokenGenerator这个东西使用还是它父类本身的功能,之所以这样做是为了在必要的时候可以重写一些功能。父类PasswordResetTokenGenerator的功能主要是根据用户主键来生成token,之后还会根据传递的token和用户主键去检查传递的token是否一致。
针对邮件发送我这里使用Django提供的封装,你需要在settings.py中添加如下内容:
# 邮件设置 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_USE_SSL = True EMAIL_HOST = 'smtp.163.com' EMAIL_PORT = 465 EMAIL_HOST_USER = '' # 发件人邮箱地址 EMAIL_HOST_PASSWORD = '' # 发件人邮箱密码 DEFAULT_FROM_EMAIL = EMAIL_HOST_USER Services层这层主要是根据用例来实现业务逻辑,比如注册用户账号和激活用户账号。
""" Service层,针对不同用例实现的业务逻辑代码 """ from django.utils.translation import gettext as _ from django.shortcuts import render from .utils import ( WelcomeEmail, TokenGenerator, ) from users.models import ( UserAccount ) class UsernameAlreadyExistError(Exception): pass class UserIdIsNotExistError(Exception): """ 用户ID,主键不存在 """ pass class ActivatitionTokenError(Exception): pass class RegisterUserAccount: def __init__(self, request, username, password, confirm_password, email): self._username = username self._password = password self._email = email self._request = request def valid_data(self): """ 检查用户名是否已经被注册 :return: """ user_query_set = UserAccount.objects.find_by_username(username=self._username).first() if user_query_set: error_msg = ('用户名 {} 已被注册,请更换。'.format(self._username)) raise UsernameAlreadyExistError(_(error_msg)) return True def _send_welcome_email_to(self, user_account): """ 注册成功后发送电子邮件 :param user_account: :return: """ WelcomeEmail.send_to(self._request, user_account) def execute(self): self.valid_data() user_account = self._factory_user_account() self._send_welcome_email_to(user_account) return user_account def _factory_user_account(self): """ 这里是创建用户 :return: """ # 这样创建需要调用save() # ua = UserAccount(username=self._username, password=self._password, email=self._email) # ua.save() # return ua # 直接通过create_user则不需要调用save() return UserAccount.objects.create_user( self._username, self._email, self._password, ) class ActivateUserAccount: def __init__(self, uid, token): self._uid = uid self._token = token def _account_valid(self): """ 验证用户是否存在 :return: 模型对象或者None """ return UserAccount.objects.all().get(id=self._uid) def execute(self): # 查询是否有用户 user_account = self._account_valid() account_activation_token = TokenGenerator() if user_account is None: error_msg = ('激活用户失败,提供的用户标识 {} 不正确,无此用户。'.format(self._uid)) raise UserIdIsNotExistError(_(error_msg)) if not account_activation_token.check_token(user_account, self._token): error_msg = ('激活用户失败,提供的Token {} 不正确。'.format(self._token)) raise ActivatitionTokenError(_(error_msg)) user_account.is_activated = True user_account.save() return True这里定义的异常类比如UsernameAlreadyExistError等里面的内容就是空的,目的是raise异常到自定义的异常中,这样调用方通过try就可以捕获,有些时候代码执行的结果影响调用方后续的处理,通常大家可能认为需要通过返回值来判断,比如True或者False,但通常这不是一个好办法或者说在有些时候不是,因为那样会造成代码冗长,比如下面的代码:
这是上面代码中的一部分,
def valid_data(self): """ 检查用户名是否已经被注册 :return: """ user_query_set = UserAccount.objects.find_by_username(username=self._username).first() if user_query_set: error_msg = ('用户名 {} 已被注册,请更换。'.format(self._username)) raise UsernameAlreadyExistError(_(error_msg)) return True def execute(self): self.valid_data() user_account = self._factory_user_account() self._send_welcome_email_to(user_account) return user_account