Django Auth(身份验证)

一、引入Auth模块

Django 用户认证(Auth)组件一般用在用户的登录注册上,用于判断当前的用户是否合法,并跳转到登陆成功或失败页面。

Django 用户认证(Auth)组件需要导入 auth 模块:

# 认证模块
from django.contrib import auth

# 对应数据库
from django.contrib.auth.models import User

二、创建用户对象

创建用户对象的三种方法:

  • create():创建一个普通用户,密码是明文的,无法使用authenticate进行验证。
  • create_user():创建一个普通用户,密码是密文的。
  • create_superuser():创建一个超级用户,密码是密文的,要多传一个邮箱 email 参数。

参数:

  • username: 用户名。
  • password:密码。
  • email:邮箱 (create_superuser 方法要多加一个 email)。

返回:

返回值是用户对象。

# 认证模块
from django.contrib import auth

# 对应数据库
from django.contrib.auth.models import User

# 方法一:create():创建一个普通用户,密码是明文的。
User.objects.create(username='eword',password='123456')

# 方法二:create_user():创建一个普通用户,密码是密文的。
User.objects.create_user(username='eword',password='123456')

# 方法三:create_superuser():创建一个超级用户,密码是密文的,要多传一个邮箱 email 参数。
User.objects.create_superuser(username='eword',password='123456',email='eword@eword.name')

创建后auth_user数据表中的数据

image-20201027115514817

三、登入操作

3.1、账号密码验证

方法:

  • authenticate():验证账号密码,create()创建的账号无法通过验证。

参数:

  • username: 用户名。
  • password:密码。

返回:

从 auth_user 表中过滤出的用户对象。

# 认证模块
from django.contrib import auth
# 对应数据库
from django.contrib.auth.models import User


# 登入操作
def login(request):
    if request.method == "GET":
        # GET请求时执行
        # 函数“get_valid_code”生成验证码存入session
        # 返回登入页面
        return render(request, 'login.html', {"valid_code": get_valid_code(request)})
    elif request.method == "POST":
        # POST请求时执行
        # 获取登入时填写的用户名、密码和验证码
        username = request.POST.get("username")
        password = request.POST.get("password")
        valid_code = str(request.POST.get("valid_code"))
        # 获取session中保存的验证码
        keep_code = request.session.get("keepcode")
        if keep_code.upper() == valid_code.upper():
            # 验证码正确时执行
            user_obj = auth.authenticate(username=username, password=password)
            print(user_obj)
            if not user_obj:
                # 账号或密码不正确时执行
                # 从新生成验证码,并返回登入页面
                return render(request, 'login.html', {"valid_code": get_valid_code(request)})
            else:
                # 登入成功时执行
                # 记录登入状态
                auth.login(request, user_obj)
                # 重定向到登入前请求页面,如果没有设置则返回首页
                path = request.GET.get("next") or "/index"
                print(path)
                return redirect(path)
    # 默认返回登入异常提示(在既不是GET请求也不是POST请求时触发)
    return HttpResponse('登入异常')




# 获取验证码并设置session
def get_valid_code(request):
    vcode = str(random.randint(100000, 999999))
    request.session["keepcode"] = vcode
    request.session.set_expiry(60)  # 60 秒之后失效
    return vcode

Django会为登入成功后的用户加 session,将 request.user 赋值为用户对象。

注意: 使用“ User.objects.create(username='eword',password='123456')“创建一个普通用户,密码是明文无法正常登入。

四、注销(登出)操作

方法:

  • logout():注销。

参数:

  • request: 用户对象

返回:

None

# 认证模块
from django.contrib import auth


# 注销操作
def logout(request):
    result = auth.logout(request)
    print(result)  # 返回None
    return redirect("/login/")  # 重定向到登入页

五、登入拦截(设置装饰器)

我们在网站开发过程中,经常会遇到这样的需求:

  • 用户登陆系统才可以访问某些页面
  • 如果用户没有登陆而直接访问就会跳转到登陆界面,而不能访问其他页面。
  • 用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址

要实现这样的需求其实很简单:

  1. 使用django自带的装饰器 @login_required
  2. 在相应的view方法的前面添加@login_required
  3. 并在settings.py中配置LOGIN_URL参数
  4. 修改login.html中的表单action参数
from django.contrib.auth.decorators import login_required  # 导入登入拦截装饰器


@login_required
def index(request):
    return HttpResponse("我是需要登入才能访问的首页!!!")

访问http://127.0.0.1:8000/blog/index/时,如果用户未登入,默认会跳转到http://127.0.0.1:8000/accounts/login/?next=/blog/index/,其中accounts/login/是默认的登入页面地址,这个可以通过在setting.py文件中设置LOGIN_URL参数来进行定义。而?next=/blog/index/是自动添加上去的上一次访问地址,也就是是哪一个页面跳转到默认登入页,在成功登入后可跳转回去。

# setting.py 文件

LOGIN_URL = '/accounts/login/'  #这个路径需要根据你网站的实际登陆地址来设置

5.1、如果使用默认

results matching ""

    No results matching ""