is_authenticate 和 login_required判断用户是否登录
- 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
# 继承自: View
class 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.
# 我们定义的工具类:
# 继承自 object
class LoginRequired(object):
"""验证用户是否登陆的工具类"""
# 重写该函数:
@classmethod
def 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')