1.用户的登录或登出

1.1. 用户认证和登录

  1. # views.py
  2. from django.contrib.auth import authenticate, login
  3. def my_view(request):
  4. username = request.POST['username']
  5. password = request.POST['password']
  6. # 参考 用户对象:用户验证
  7. user = authenticate(username=username, password=password)
  8. if user is not None:
  9. login(request, user)
  10. # 跳转到成功页面
  11. else:
  12. # 返回一个非法登录的错误页面

参考 10. 用户对象:增改删

1.2. 判断用户是否登录

Django 每一次请求中都包含一个request.user属性,表示当前用户。如果该用户未登陆,该属性的值是一个AnonymousUser实例(匿名用户),如果已经登录,该属性就是一个User模型的实例。

  1. # views.py
  2. if request.user.is_authenticated:
  3. # 用户已登录
  4. else:
  5. # 用户未登录

1.3. 注销用户

  1. # views.py
  2. from django.contrib.auth import logout
  3. def logout_view(request):
  4. logout(request)
  5. # 跳转到注销成功页

2. 限制未登录用户

2.1. 重定向到登录页面

  1. from django.conf import settings
  2. from django.shortcuts import redirect
  3. def my_view(request):
  4. if not request.user.is_authenticated:
  5. return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

2.2. 显示错误信息

  1. from django.shortcuts import render
  2. def my_view(request):
  3. if not request.user.is_authenticated:
  4. return render(request, 'myapp/login_error.html')

2.3. 装饰器:强制登录后访问

实现逻辑:

  • 如果用户未登陆,重定向到settings.LOGIN_URL
  • 传递当前绝对路径作为url字符串的参数
  • 例如:/accounts/login/?next=/polls/3/
  • 如果用户已经登录,执行正常的视图
  1. from django.contrib.auth.decorators import login_required
  2. @login_required
  3. def my_view(request):
  4. #...

2.4. LoginRequiredMixin

  1. from django.contrib.auth.mixins import LoginRequiredMixin
  2. class MyView(LoginRequiredMixin):
  3. login_url = '/login/'
  4. redirect_field_name = 'redirect_to'

3. 只允许指定部分用户

3.1. 在视图中过滤

  1. # 比如:根据邮箱地址判断权限
  2. from django.shortcuts import redirect
  3. def my_view(request):
  4. if not request.user.email.endswith('@example.com'):
  5. return redirect('/login/?next=%s' % request.path)

3.2. 权限需求装饰器(参考 20. 权限系统:用户和组.md

  1. from django.contrib.auth.decorators import permission_required
  2. @permission_required('polls.can_vote')
  3. def my_view(request):
  4. #...