django登陆判断
某些页面需要用户登录后才能访问,如个人中心,实现的逻辑就是简单地判断当前用户的登录状态而已。
1. 直接在类视图中写登录校验实现:
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用户认证系统提供了方法
request.user.is_authenticated()
来判断用户是否登录。
如果通过登录验证则返回True
,反之,返回False
。
缺点:登录验证逻辑很多地方都需要,所以该代码需要重复编码好多次
2. 对路由中as_view()使用装饰器:login_required
- 在定义路由时添加:
url(r'^info/$', login_required(views.UserInfoView.as_view()), name='info')
3. 定义验证用户是否登录扩展类
使用Django自带login_required装饰器来完成扩展,
完成扩展后需要使用该功能的视图只需多继承该类即可,复用率高
在自定义工具目录中:
from django.contrib.auth.decorators import login_required
class LoginRequiredMixin(object):
@classmethod
def as_view(cls,**kwargs):
view = super().as_view(**kwargs)
return login_required(view)
使用时导包并同时继承自定义类LoginRequiredMixin和View即可:
class UserInfoView(LoginRequiredMixin, View):
"""用户中心"""
def get(self, request):
"""提供个人信息界面"""
return render(request, 'user_center_info.html')
- 装饰器
login_required
会自带next参数,和重定向地址,用于登录后跳转及不满足登录状态时重定向地址 - 如果未通过登录验证则被重定向到
LOGIN_URL
配置项指定的地址。 - 在设置文件中添加如下配置:表示当用户未通过登录验证时,将用户重定向到路径为
/login/
的登录页面,
LOGIN_URL = '/login/'
- 若不设置,默认未通过登录验证时跳转路径为:
/accounts/login/
- 跳转后的next参数,帮助用户在完成登录后,自动跳转回登录前的页面