Django - Auth 组件

本文详细介绍了Django的Auth组件,包括用户注册、登录、权限管理等核心方法。如create_user和create_superuser用于创建用户,authenticate和login处理验证与登录,is_authenticated检查认证状态,is_staff和is_active判断管理权限和登陆许可。同时,讨论了扩展auth_user表的两种策略:一对一关系和继承AbstractUser。
摘要由CSDN通过智能技术生成

目录

一、Auth组件 - Django自带的用户认证模块

二、 Auth组件的常用方法 - from django.contrib import auth

2-1 注册相关方法 

- create_user(username,password) -- 创建普通用户

- create_superuser(username,password,email) -- 创建超级用户

2-2 登陆相关方法

- authenticate(username,password) -- 用户验证,返回User对象

- login(HttpRequest, user) -- 用户登陆,写入session

- logout(request) -- 清除当前请求的session信息,无返回值

- is_authenticated() -- request.user内方法,判断当前请求是否通过验证,返回布尔值

- @login_requierd(redirect_field_name,login_url) -- 登陆验证装饰器

2-3 修改密码相关

- check_password(password) -- request.user内方法,检查密码是否正确,返回布尔值

- set_password(password) -- request.user内方法,修改密码,参数为新密码

2-4 查看用户权限相关

- is_staff  -- 是否拥有网站的管理权限(登陆内置admin组件的权限)

- is_active  -- 是否允许登陆(布尔值)

 三、扩展Auth自动产生的auth_user表(两种方式)

方式一、新建表模型,与auth_user表建立一对一关系

方式二、新建表模型,继承AbstractUser

 


一、Auth组件 - Django自带的用户认证模块

我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情呢。

Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用户数据。

二、 Auth组件的常用方法 - from django.contrib import auth

注意:

  • request.user 产生原因:发送请求后,在中间件内,通过cookie查询user信息,若存在放到request.user内,若不存在放入匿名用户
  • request内的属性和方法可以在模板内直接使用

2-1 注册相关方法 

注意:

  • 创建用户必须使用Auth内方法,手动写入表内的密码字段是明文形式
  • 注意导入Auth内部自设表对象,以及防止重名
    from django.contrib.auth.models import User
  • 可以在终端下创建超级用户 -- python3 manage.py createsuperuser

- create_user(username,password) -- 创建普通用户

from django.contrib.auth.models import User

user = User.objects.create_user(username='test', password=123)

- create_superuser(username,password,email) -- 创建超级用户

注意一:必须填入email字段,否则报错如下

注意二:用户名不可重名,否则报错如下

from django.contrib.auth.models import User

user = User.objects.create_superuser(username='test1', password=123,email='123@123.com')

 

 

2-2 登陆相关方法

- authenticate(username,password) -- 用户验证,返回User对象

from django.contrib import auth

user = auth.authenticate(username='test', password=123)
print(type(user))
# <class 'django.contrib.auth.models.User'>

# 同上,对数据库的查询操作
user = models.User.objects.filter(name='test',pwd='123').first()

- login(HttpRequest, user) -- 用户登陆,写入session

'''
auth.login(request, user)
    接受一个HttpRequest对象,以及一个经过认证的User对象。

登陆成功后:
    - 以后再视图类,函数中的request对象中,就有一个user对象,就是当前登录的用户对象
	- 如果没有登录,request.user=AnonymousUser,匿名用户
'''

from django.contrib import auth

def login(request):
    if request.method == 'GET':

        return render(request, 'login.html')
    elif request.method == 'POST':
        name = request.POST.get('name')
        pwd = request.POST.get('pwd')
        # 校验,获取对象
        user = auth.authenticate(request, username=name, password=pwd)
        if user:
            # 登录,其实就是把用户信息放到session
            auth.login(request, user)
            # 同上
            # request.sessiono['name']=name

            return HttpResponse('登录成功')
        else:
            return HttpResponse('用户名或密码错误')

logout(request) -- 清除当前请求的session信息,无返回值

from django.contrib import auth

def logout(request):

    auth.logout(request)
    # 内部:调用了request.session.flush(),删除了登录状态

    return redirect('/login/')

is_authenticated() -- request.user内方法,判断当前请求是否通过验证,返回布尔值

'''
可以将 is_authenticated()放在模板中使用,判断是否登陆
{{ request.user.is_authenticated }}

页面上显示>>> CallableBool(False)
'''

from django.shortcuts import render, HttpResponse, redirect

def check_login(request):

    print(request.user.is_authenticated()) # True

    if not request.user.is_authenticated():
        return HttpResponse('error!please login!')

    return HttpResponse('ok')

- @login_requierd(redirect_field_name,login_url) -- 登陆验证装饰器

'''
@login_required(redirect_field_name='eee',login_url='/login/')
- redirect_field_name:修改?后面的key值,一般不进行设置
- login_url:如果没有登录,跳转到的页面
	- 可以局部配置
	- 可以全局配置(在setting中) LOGIN_URL='/login/'

@login_required(redirect_field_name='aaa',login_url='/login/')
 --- http://127.0.0.1:8000/login/?aaa=/test/
'''

from django.contrib.auth.decorators import login_required

@login_required
def test(request):
    # from django.core.handlers.wsgi import WSGIRequest
    print(type(request))
    user = request.user.password
    print(user)
    return render(request, 'test.html')

 

2-3 修改密码相关

注意一:只能在登陆之后进行查询、修改操作,否则报错如下:

- check_password(password) -- request.user内方法,检查密码是否正确,返回布尔值

'''
auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。

密码正确返回True,否则返回False。
'''


def check_pwd(request):
    # 将获取的pwd与当前登陆成功的密码进行比对操作
    pwd = '1233'
    ret = request.user.check_password(pwd)
    print(ret)
    return HttpResponse('ok')

- set_password(password) -- request.user内方法,修改密码,参数为新密码


'''
auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。

注意:设置完一定要调用用户对象的save方法!!!
'''

@login_required(login_url='/login/')
def change_pwd(request):
    pwd = '1111'
    user = request.user
    user.set_password(pwd)
    user.save()

    return HttpResponse('ok')

 

2-4 查看用户权限相关

- is_staff  -- 是否拥有网站的管理权限(登陆内置admin组件的权限)

- is_active  -- 是否允许登陆(布尔值)

 三、扩展Auth自动产生的auth_user表(两种方式)

方式一、新建表模型,与auth_user表建立一对一关系

from django.db import models
from django.contrib.auth.models import User


class UserDetail(models.Model):
    phone = models.CharField(max_length=32)
    # 一对一跟auth_user表做关联
    # 不加引号:外部映入的表模型
    # 加引号:models存在的表模型
    user = models.OneToOneField(to=User)

方式二、新建表模型,继承AbstractUser

'''
必须在setting内全局配置 : AUTH_USER_MODEL ='app01.UserInfo'

数据迁移后,不存在内置的auth_user表,认证组件都使用跟新的UserInfo表

注意:之后各类Auth方法使用的User表模型导入,都换成app01.UserInfo的导入
'''


from django.db import models
from django.contrib.auth.models import User, AbstractUser


class UserInfo(AbstractUser):
    # 新增、修改字段
    phone=models.CharField(max_length=32)
    sex=models.BooleanField()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值