django-auth2

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()
原文地址:https://www.cnblogs.com/liuer-mihou/p/13925464.html