1.用户的登录或登出
1.1. 用户认证和登录
# views.py
from django.contrib.auth import authenticate, login
def 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.py
if request.user.is_authenticated:
# 用户已登录
else:
# 用户未登录
1.3. 注销用户
# views.py
from django.contrib.auth import logout
def logout_view(request):
logout(request)
# 跳转到注销成功页
2. 限制未登录用户
2.1. 重定向到登录页面
from django.conf import settings
from django.shortcuts import redirect
def 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 render
def 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_required
def my_view(request):
#...
2.4. LoginRequiredMixin
from django.contrib.auth.mixins import LoginRequiredMixin
class MyView(LoginRequiredMixin):
login_url = '/login/'
redirect_field_name = 'redirect_to'
3. 只允许指定部分用户
3.1. 在视图中过滤
# 比如:根据邮箱地址判断权限
from django.shortcuts import redirect
def 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):
#...