Django自带用户验证系统

django验证系统

背景

使用

  • 在项目的settings.py文件中添加配置信息

    1
    2
    # 使用django自带的用户验证时,需要配置该选项,否则验证的结果一直为None
    AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.AllowAllUsersModelBackend']
  • 在视图中使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 使用django自带的验证系统
    # 用户登录以后,一般需要记录用户的登录状态,
    # 此时不建议将其存储在django自身的session表中,而是将其记录在redis数据库中
    from django.contrib.auth import authenticate, login

    # 登录验证,用的是django自带的用户验证方式
    # 如果查询的结果能够获取到数据,则返回数据,否则返回None
    user = authenticate(username=username, password=password)

    # 使用session记录用户的登录状态,login()函数是将用户的ID信息保存在session表中
    # 用户信息验证成功后才记录状态
    # 第一个参数是request对象,第二个是数据库存储的该用户的数据对象
    login(request, user)
  • 详细案例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    from django.contrib.auth import authenticate, login
    def post(self, request):
    '''用户登录请求'''
    username = request.POST.get('username')
    password = request.POST.get('pwd')
    remember = request.POST.get('remember')

    if not all([username, password]):
    return render(request, 'User/login.html', {"msg": "用户名或密码错误"})

    user = authenticate(username=username, password=password)
    if user is not None:
    # 判断用户是否激活了
    if user.is_active:
    login(request, user)
    # 生成返回值对象,redirect是导入的重定向函数
    response = redirect('goods:index')
    # 设置cookie信息
    if remember == 'on':
    response.set_cookie('username', username, max_age=7 * 24 * 3600)
    else:
    # 删除Cookie的方法:delete_cookie
    response.delete_cookie('username')
    return response
    else:
    return render(request, 'User/login.html', {"msg": "你得账户还没有激活,请及时激活"})
    else:
    return render(request, 'User/login.html', {"msg": "输入的密码不正确"})

django验证登录

背景

  • 解决问题

    有些页面只允许登录用户才可以访问,对于这类页面,当用户访问的时候,我们需要对其登录进行验证

  • 使用模块

    django自带的验证系统:login_required装饰器 / LoginRequired Mixin。使用该方式验证的前提是使用django自带的登录函数login登录

  • 参考文档:

    https://docs.djangoproject.com/zh-hans/3.1/topics/auth/default/

使用

  1. 配置项目settings.py中的 LOGIN_URL 配置项

    1
    2
    3
    # 如果不配置该选项,则用户默认跳转至/account/login页面,通过配置该项可以修改用户跳转的页面
    # 如果未配置,则需要修改urls.py中的视图,便于关联/account/login视图
    LOGIN_URL = '/user/login'
  2. 在需要用到登录验证的视图中继承LoginRequiredMixin类

    1
    2
    3
    4
    5
    6
    7
    # 使用Mixins验证用户是否登录
    from django.contrib.auth.mixins import LoginRequiredMixin

    # 在需要验证的视图类中,首先继承LoginRequiredMixin类
    class UserInfoView(LoginRequiredMixin, View):
    def get(self, request):
    return render(request, 'User/user_center_info.html', {'page':"user"})
  3. 此时访问该视图对应的页面,如果已经登录,则可以直接访问该页面,否则跳转到 LOGIN_URL 配置的页面

拓展

1
2
3
4
5
6
7
class UserInfoView(LoginRequiredMixin, View):
def get(self, request):
# 视图函数在调用的时候,只要用户访问了,都会生成一个request.user的实例
# 如果用户登录了,则该对象返回的是登录用户。如果该用户未登录,则该对象返回的是AnonymousUser
# request.user.is_authenticated:如果用户登录,该属性返回True,否则返回False
# 视图函数在使用模板的时候,会默认将request.user对象传给模板,它在模板中对应的变量名就是user,可以直接调用
return render(request, 'User/user_center_info.html', {'page':"user"})

django用户退出

背景

使用

1
2
3
4
5
6
7
8
# 导入login的模块
from django.contrib.auth import authenticate, login, logout

class LogoutView(View):
def get(self, request):
logout(request)
# 退出之后的会话操作可以在此写
return redirect(reverse("goods:index"))