# 邮箱注册登录流程 首先,需要新建一个users应用,来处理用户相关操作,包括登录注册等权限操作, 以及用户中心的相关操作;然而,django自带的user表中可能不足以满足我们项目所需要 的字段,所以需要重载django内置的User表,需要建立一个模型类UserProfile,继承 auth.models下的AbstractUser类,自己再添一些需要的字段,最重要的是要在settings.py 文件中添加配置,AUTH_USER_MODEL="users.UserProfile"(应用名+模型类),再迁移生成数 据库表; 接着,邮箱注册; 最重要的是邮箱激活(is_active):在后台生成若干个随机字符code,保存到数据库表中,并且将code 格式化输出到邮件内容中,发送给用户点击激活;如何做到在邮箱中点击激活这个code呢? 1.设置urlconf,url(r‘^active/(?P<active_code>.*)‘, RegisterView.as_view(), name=‘注册‘), 那么,我们在发送邮件的内容中就需要添加这样式的激活链接: ‘点击激活:http://127.0.0.1:8000/active/...‘,在用户点击跳转这个链接的时候,后端urlonf 就会将active_code当作参数传到对应的视图类中,通过传入的激活码,在EmailVerify表中查找 对应的邮箱,通过邮箱找到User表中的is_active字段,并修改;从而实现激活状态; 2.发送邮箱的过程;通过django自带的mail模块中的send_mail()或者send_mass_masil()函数来实现; django后端默认的backend是smtp服务,所以只要在第三方邮箱入口打开smtp服务,在settings.py 文件中添加一些配置,就可以通过一个邮箱发送的函数来发送激活邮件,主要的参数是title,body 以及谁发的邮件,和对方的邮件列表;这里需要注意的是,需要传入一个发送目的,比如注册发送, 修改密码发送等;那么构造的发送邮件的函数就可以自己判断,从而对不同用户操作,发出不同的内容 的邮件; 3.当然所有form表单提交视图操作都需要创建一个form来验证字段,验证通过后再做邮箱发送操作; 4.判断用户名是否已经存在;在表单中获取用户名(邮箱)之后,需要先对邮箱是否存在进行判断; 接着,登录; 通过django内置的authenticate()方法与login()方法来实现用户登录; 1.form表单验证; 2.将POST中获取提交的数据,通过authenticate()方法来认证用户名与密码; 这里需要注意的是,这次登录时通过邮箱的,那么网站可以还有手机注册的用户, 我们是通过email或者tel来保存的,并不是username;所以,登录的时候,需要 做一个‘或‘的操作;但是,django的authenticate()只对用户名密码进行验证,就 需要自定义authenticate()这个认证方法了: authenticate()内部先通过用户名查找到user对象,再通过check_password()检验这个对 象密码是否存在,最后返回一个user; 所以,我们需要对用户查找user对象这个步骤做操作,利用Q使得查询条件: Q(username=username)|Q(email=username)表示输入的用户名可以在username字段中找到, 或者在email字段中找到即可; 自定义authenticate()需要重载settings.py中的AUTHENTICATION_BACKENDS变量, 构造的CustomBackend需要继承ModelBackend这个类; 3.认证通过后login()登录; 最后,找回密码; 1.点击login.html页面的找回密码的链接,跳转到输入用户名与验证码的页面(需要表单验证), 表单验证通过之后,发送重置码reset_code到邮箱,通过urlconf携带的参数传给重置密码 视图类; 2.上面表单提交之后跳转重置密码页面,包含pwd1与pwd2两个字段,这个跳转过程用get()来处理; 但是,当前页面的表单提交的action就不能用同样的视图类了,因为get()需要接受一个重置码, action=‘{% url ‘..‘ ...code??? %}‘ 所以,我们重新写一个重置密码的视图类,通过post()来处理表单; 又有一个问题,当前表单的验证只有pwd1与pwd2两个字段,没法获取user对象进行操作; 3.在get()方法中传一个email的值作为上下文传到前端去,写到一个隐藏的input框中; 那么post()就可以从input框中获取email值,从而获取user对象了;