Django组件之用户认证组件

用户认证

  • 功能:记录用户登陆状态,必须使用django自带的auth_user表,后续需要添加字段,可以继承这一张表,也可以一对一绑定这张表

  • 创建超级用户:python3 manage.py createsuperuser

auth模块

from django.contrib import auth

authenticate()

用户登陆认证,传入username与password,如果验证成功则返回的是user对象,失败则返回None,当试图登陆一个从数据库中直接取出来不经过authenticate()的User对象会报错的

user = authenticate(username='someone',password='somepassword')

login(HttpRequest,user)

该函数接受一个HttpRequest对象,以及一个通过认证了的User对象

函数使用django的session框架给某个已认证的用户附加上session id等信息。可使用request.user使用该对象,并且该对象是全局变量,在模板中可以直接使用

如果没有认证通过则调用request.user是一个匿名用户

def login(request):
    if request.method == 'POST':
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')

        # 用户认证接口,如果验证成功,则user对象,失败则返回None
        user = auth.authenticate(username=user,password=pwd)
        if user:
            auth.login(request,user) # request.user = user
            # request.user永远是当前登陆对象
            return redirect("/index/")

    return render(request,'login.html')
    
def index(request):

    # 假如说没有登陆的话打印的是匿名用户
    # 登陆了打印的是当前登陆的用户信息
    print(request.user)
    print(request.user.id)
    print(request.user.is_anonymous) # 打印当前是否是匿名用户
    return render(request,'index.html')

logout(request)

注销函数,该函数接收一个HttpRequest参数,使用该参数会清空session以及session数据库中的数据

def logout(request):
    auth.logout(request)
    return redirect('/login/')

基于用户认证组件的注册功能

User 对象属性:username, password(必填项)password用哈希算法保存到数据库

from django.contrib.auth.models import User
  • User对象的is_authenticated

如果是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经通过了认证。

  • 注册
from django.contrib.auth.models import User
user = User.objects.create_user(username='',password='',email='')
def reg(request):
    if request.method == 'POST':
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        # 注册普通用户
        user = User.objects.create_user(username=user,password=pwd)
        # 注册超级用户
        # user = User.objects.create_superuser(username=user,password=pwd)
        return redirect('/login/')

    return render(request,'reg.html')
  • check_password(password)

用户需要修改密码的时候 首先要让他输入原来的密码 ,如果给定的字符串通过了密码检查,返回 True

  • 修改密码

使用 set_password() 来修改密码

user = User.objects.get(username='')
user.set_password(password='')
user.save

基于用户认证组件的认证装饰器

要求:

  • 用户登陆后才能访问某些页面,
  • 如果用户没有登录就访问该页面的话直接跳到登录页面
  • 用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址

可以直接使用django设计好装饰器:login_required()

若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' (这个值可以在settings文件中通过LOGIN_URL进行修改)。并传递 当前访问url的绝对路径 (登陆成功后,会重定向到该路径)

from django.contrib.auth.decorators import login_required

假设登陆后才可以访问order(不是在登陆成功后写死)

def login(request):
    if request.method == 'POST':
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        user = auth.authenticate(username=user,password=pwd)
        if user:
            auth.login(request,user) # request.user = user

            # 使用装饰器动态获取登陆后跳转的页面,如果没有获取到next值则默认跳转到index
            red_url = request.GET.get('next','/index/')
            return redirect(red_url)

    return render(request,'login.html')
    
@login_required
def order(request):
    return render(request,'order.html')

原文地址:https://www.cnblogs.com/wualin/p/10146335.html