用户登录

一、使用django中自带的用户登录及权限拦截的方式

  • 1、登录页面就不演示了
  • 2、视图层中导包

    from django.shortcuts import render, redirect
    from django.views.generic import View
    # authenticate是验证用户名及密码的
    # login的登陆的方法
    from django.contrib.auth import authenticate, login
    
  • 3、视图类

    class LoginView(View):
        """
        用户登录的视图
        """
    
        def get(self, request, *args, **kwargs):
            return render(request, 'login.html', kwargs)
    
        def post(self, request, *args, **kwargs):
            username = request.POST.get('username', None)
            password = request.POST.get('password', None)
            # 校验用户名及密码
            user = authenticate(username=username, password=password)
            if user is not None:
                login(request, user)
                # 登陆成功重定向到主页
                return redirect('home')
            return self.get(request, message='用户名或者密码错误')
    
  • 4、总结

    • 1.使用django中自带的login登陆方法,会把用户名存放到request中,在别的视图中需要获取用户名直接使用request.user就可以
    • 2.登陆成功后会在django_session表中创建一条记录,默认的过期时间是2周

二、修改登录方式

django默认是使用用户名登陆的,在现实中往往可以使用用户名、手机号码、邮箱等来登陆

  • 1、视图层导包

    from django.contrib.auth.backends import ModelBackend
    from django.db.models import Q
    # 导入自己定义的模型
    from users import models
    
  • 2、定义一个类继承ModelBackend

    class CustomBackend(ModelBackend):
        """
        定义校验用户登录
        """
    
        def authenticate(self, request, username=None, password=None, **kwargs):
            try:
                # 使用用户名、邮箱、手机号码都可以登录
                user = models.UserProfileModel.objects.get(Q(username=username) | Q(email=username) | Q(mobile=username))
                if user.check_password(password):
                    return user
            except Exception as e:
                print(e)
                return None
    
  • 3、在settings.py中配置使用我们自定义的类

    # 配置登录的类
    AUTHENTICATION_BACKENDS = (
        'users.views.login.CustomBackend',
    )
    
  • 4、上面配置后登陆的视图类跟上面一样的,不需要改动

  • 5、关于别的视图中获取到用户信息

    class IndexView(View):
        def get(self, request, *args, **kwargs):
            print('*' * 100)
            # 获取登陆的用户信息
            print(request.user)
            # 返回True/False
            print(request.user.is_authenticated)
            print('*' * 100)
            return render(request, 'index.html')
    

results matching ""

    No results matching ""