- Django 的用户认证系统提供了方法
request.user.is_authenticated()
来判断用户是否登录. - 通过登录验证这个方法返回 True. 否则: 返回 False.
class UserInfoView(View): """用户中心""" def get(self, request): """提供个人信息界面""" # 进行判断: 是否登录验证 if request.user.is_authenticated(): # 如果登录, 则正常加载用户中心页面 return render(request, 'user_center_info.html') else: # 否则, 进入登录页面,进行登录 return redirect(reverse('users:login'))
- Django 的用户认证系统提供了
login_required
这个装饰器来判断用户是否登录- 内部封装了
is_authenticate
- 位置:
django.contrib.auth.decorators
- 内部封装了
- 通过登录验证则进入到视图内部,执行视图逻辑
- 未通过登录验证则被重定向到
LOGIN_URL
配置项指定的地址- 所以在使用该装饰器时, 我们需要在 dev.py 文件中, 添加如下设置:
LOGIN_URL = '/login/'
- 登录用户才能访问, 否则访问的路径
- 所以在使用该装饰器时, 我们需要在 dev.py 文件中, 添加如下设置:
login_required
用法
- 直接装饰函数视图
- as_view() 方法是将类视图转成的函数视图, 要想使用 login_required 装饰器 装饰类视图,可以间接的装饰 as_view() 方法的返回值
# 在子路由中, 给 as_view() 函数,添加装饰器: url(r'^info/$', login_required(views.UserInfoView.as_view()), name='info'),
- 定义 View 子类: 封装 login_required 装饰器
# 定义工具类: LoginRequired# 继承自: Viewclass LoginRequired(View): """验证用户是否登陆的工具类""" # 重写 as_view() 函数 # 在这个函数中, 对 as_view 进行装饰 @classmethod def as_view(cls, **initkwargs): # 我们重写这个方法, 不想做任何的修改操作 # 所以直接调用父类的 super().as_view() 函数. view = super().as_view() return login_required(view)
我们自己的类视图, 让其继承自 LoginRequired
class UserInfoView(LoginRequired): """用户中心接口""" def get(self, request): """提供个人信息界面""" return render(request, 'user_center_info.html')
不推荐:工具类直接依赖于视图类 View,所以复用性相对来说很差.
3.使其继承自 object.
# 我们定义的工具类: # 继承自 objectclass LoginRequired(object):"""验证用户是否登陆的工具类"""# 重写该函数: @classmethoddef as_view(cls, **initkwargs): # 调用父类的 as_view() 方法 view = super().as_view() # 添加装饰行为: return login_required(view)
定义我们自己的类视图, 需要让它继承自: 工具类 + View
class UserInfoView(LoginRequired, View): """用户中心""" def get(self, request): """提供个人信息界面""" return render(request, 'user_center_info.html')
升级改造,推荐:
- 将工具类转移到 utils 工具类文件中
# 导入: from django.contrib.auth.decorators import login_required# 添加扩展类:# 因为这类扩展其实就是 Mixin 扩展类的扩展方式# 所以我们起名时, 最好也加上 Mixin 字样, 不加也可以.class LoginRequiredMixin(object): """验证用户是否登录的扩展类""" @classmethod def as_view(cls, **initkwargs): # 调用父类的 as_view() 函数 view = super().as_view() return login_required(view)
在 users.views.py 文件中, 引入代码:
# 导入from meiduo_mall.utils.views import LoginRequiredMixin# 添加用户中心类: class UserInfoView(LoginRequiredMixin, View): """用户中心""" def get(self, request): """提供个人信息界面""" return render(request, 'user_center_info.html')