1.用户的登录或登出
1.1. 用户认证和登录
# views.pyfrom django.contrib.auth import authenticate, logindef my_view(request):username = request.POST['username']password = request.POST['password']# 参考 用户对象:用户验证user = authenticate(username=username, password=password)if user is not None:login(request, user)# 跳转到成功页面else:# 返回一个非法登录的错误页面
参考 10. 用户对象:增改删
1.2. 判断用户是否登录
Django 每一次请求中都包含一个request.user属性,表示当前用户。如果该用户未登陆,该属性的值是一个AnonymousUser实例(匿名用户),如果已经登录,该属性就是一个User模型的实例。
# views.pyif request.user.is_authenticated:# 用户已登录else:# 用户未登录
1.3. 注销用户
# views.pyfrom django.contrib.auth import logoutdef logout_view(request):logout(request)# 跳转到注销成功页
2. 限制未登录用户
2.1. 重定向到登录页面
from django.conf import settingsfrom django.shortcuts import redirectdef my_view(request):if not request.user.is_authenticated:return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
2.2. 显示错误信息
from django.shortcuts import renderdef my_view(request):if not request.user.is_authenticated:return render(request, 'myapp/login_error.html')
2.3. 装饰器:强制登录后访问
实现逻辑:
- 如果用户未登陆,重定向到settings.LOGIN_URL
- 传递当前绝对路径作为url字符串的参数
- 例如:/accounts/login/?next=/polls/3/
- 如果用户已经登录,执行正常的视图
from django.contrib.auth.decorators import login_required@login_requireddef my_view(request):#...
2.4. LoginRequiredMixin
from django.contrib.auth.mixins import LoginRequiredMixinclass MyView(LoginRequiredMixin):login_url = '/login/'redirect_field_name = 'redirect_to'
3. 只允许指定部分用户
3.1. 在视图中过滤
# 比如:根据邮箱地址判断权限from django.shortcuts import redirectdef my_view(request):if not request.user.email.endswith('@example.com'):return redirect('/login/?next=%s' % request.path)
3.2. 权限需求装饰器(参考 20. 权限系统:用户和组.md)
from django.contrib.auth.decorators import permission_required@permission_required('polls.can_vote')def my_view(request):#...
