一. 认证系统概要
- create_user 创建用户
- authenticate 验证登录
- login 记住用户的登录状态
- logout 退出登录
- is_authenticated 判断用户是否登录
- login_required 判断用户是否登录的装饰器
二. 创建用户和验证登录
当用户注册的时候用
create_user(username,password,email)
默认情况下is_active=True,is_staff=False,is_superuser=False
。- 底层将password用hash算法加密之后存储到数据库中。
当用户登录的时候用
authenticate(username=username,password=password)
验证登录,判断数据库中是否存在用户输入的账号和密码,返回一个user对象。- 底层将password用hash算法加密后和数据库中password进行对比。
三. 记住用户的登录状态
当用户登录的时候用login(request,user)
来记住用户的登录状态,默认将用户的id存储在session中。
- login有两个参数一个是request,一个是user,user的来源必须是
authenticate
返回的。也就是说用login
之前必须先调用authenticate
。
四. 退出登录
当用户注销的时候用logout(request)
,只需要一个参数request。
五. 判断用户是否登录
- 在后台的视图函数里可以用
request.user.is_authenticated()
判断用户是否登录 - 在前端页面中可以用
{% if user.is_authenticated %}{% endif %}
判断用户是否登录
六. 装饰器判断用户是否登录
- 基于普通的视图函数可以使用
@login_required
来装饰,但是基于类视图的get和post方法不能直接使用@login_required
来装饰。 - 基于类视图的装饰有以下三种:
第一种:在urls文件中导入
login_requtred
,直接装饰as_view()
函数url(r‘^$‘, login_required(UserInfoView.as_view()), name=‘user‘)
第二种:自定义一个
LoginRequiredView
类继承View
类,重写as_view()
函数,并装饰as_view()
函数的返回值。 我们自定义的视图类就不需要再继承View
类,直接继承LoginRequiredView
类就好了。class LoginRequiredView(View): @classmethod def as_view(cls, **initkwargs): # 调用View类中as_view方法 view = super(LoginRequiredView, cls).as_view(**initkwargs) # 调用login_required装饰器 return login_required(view)
第三种:自定义一个
LoginRequiredMixin
类,重写as_view()
函数,调用View
中的as_view()
函数,并装饰as_view()
函数的返回值。 我们自定义的视图类需要先继承LoginRequiredMixin
类再继承View
类。这种方式的关键点在于:多继承中super()
的调用顺序和__mro__
的顺序是一样的。class LoginRequiredMixin(object): @classmethod def as_view(cls, **initkwargs): # 调用View类中as_view方法 view = super(LoginRequiredMixin, cls).as_view(**initkwargs) # 调用login_required装饰器 return login_required(view)