init.py
0.authenticate -->1.返回一个auth过的user object
1.login -->1.将user object 存到session;2.并且request.user=user
2.logout -->1.刷新session;2.request.user=AnonymousUser
base_user.py
'''定义auth所用的BaseUserManager,AbstractBaseUser'''
具体密码的hash参考:auth.hasers.py
BaseUserManager
normalize_email
#规范化邮箱
AbstractBaseUser
save
set_password
#设置密码
check_password
#检查密码
is_authenticated
#是否通过authenticate
models.py
'''auth相关的模型'''
主要有:User(成功用户)和AnonymousUser(匿名用户)
1.User继承关系如下:
AbstractBaseUser PermissionsMixin
fields=(password,last_login) fields=(is_superuser,groups,user_permissions)
^
|
|
AbstractUser(AbstractBaseUser, PermissionsMixin)
fields=(username,first_name,last_name,email,is_staff,is_active,date_joined)
objects = UserManager()#参考下面
^
|
|
User(AbstractUser)
2.UserManager如下:
BaseUserManager
^
|
|
UserManager(BaseUserManager)
_create_user
#抽象出来公共方法
create_user
#创建用户
create_superuser
#创建超级用户
3.AnonymousUser:设置一些非值
id = None
pk = None
username = ''
is_staff = False
is_active = False
is_superuser = False
views.py
实现如下功能:
path('login/', views.LoginView.as_view(), name='login'),
path('logout/', views.LogoutView.as_view(), name='logout'),
path('password_change/', views.PasswordChangeView.as_view(), name='password_change'),
path('password_change/done/', views.PasswordChangeDoneView.as_view(), name='password_change_done'),
path('password_reset/', views.PasswordResetView.as_view(), name='password_reset'),
path('password_reset/done/', views.PasswordResetDoneView.as_view(), name='password_reset_done'),
path('reset/<uidb64>/<token>/', views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
path('reset/done/', views.PasswordResetCompleteView.as_view(), name='password_reset_complete'),
1.登录视图
AuthenticationForm
clean
#校验username和password
authenticate返回给user_cache
ProcessFormView(View) FormMixin(ContextMixin)
#实现具体的get,post方法
get
返回login.html
post
具体的login逻辑
form.is_valid 执行form_class的clean方法
^
|
TemplateResponseMixin BaseFormView(FormMixin, ProcessFormView)
^
|
SuccessURLAllowedHostsMixin FormView(TemplateResponseMixin, BaseFormView)
^
|
LoginView(SuccessURLAllowedHostsMixin, FormView)
dispatch
#重写dispatch
1.用户通过认证redirect->?next=后跟的url
2.执行父类的dispatch
form_valid
#重写了FormMixin的form_valid方法
#通过校验执行login
#HttpResponseRedirect-->next
2.logout视图
LogoutView(SuccessURLAllowedHostsMixin, TemplateView)
dispatch
#重写dispatch
#1.logout
#2.跳转next_page或者返回logout页面
3.修改密码视图
SetPasswordForm
clean_new_password2
#校验new_password1和new_password2是否相等
save
#user.set_password
#user.save()
^
|
PasswordChangeForm(SetPasswordForm)
clean_old_password
#校验旧密码是否正确
user.check_password(old_password)
PasswordChangeView(PasswordContextMixin, FormView)
dispatch
#更新成功跳转password_change_done
form_valid
#更新密码
#更新session_auth_hash
4.重新设置密码流程
PasswordResetView(发送eamil)->
PasswordResetDoneView(返回done页面)->等待用户点击url->
PasswordResetConfirmView 重新输入密码,跳转到login-url-->
PasswordResetCompleteView()