首页 > 其他分享 >【25.0】Django框架之auth模块

【25.0】Django框架之auth模块

时间:2024-04-07 18:34:06浏览次数:23  
标签:username 25.0 request 用户 auth Django user password

【一】Auth模块引入

  • 我们在创建一个Django项目之后,直接执行数据库迁移命令会自动生成很多表

    • django_session
    • auth_user
  • Django在启动之后就可以直接访问admin路由,需要输入用户名和密码,数据参考的就是auth_user表,并且必须是管理员用户才能进入

【二】创建超级用户(管理员)

python3 manage.py createsuperuser
E:\Python39\python.exe "E:\Pycharm\PyCharm 2023.1.3\plugins\python\helpers\pycharm\django_manage.py" createsuperuser "E:/Old Boy/django_project/day14"
Tracking file by folder pattern:  migrations
Username (leave blank to use 'administrator'):  dream
Email address:  
Warning: Password input may be echoed.
Password:  521
Warning: Password input may be echoed.
Password (again):  521
This password is too short. It must contain at least 8 characters.
Bypass password validation and create user anyway? [y/N]: This password is entirely numeric.
 y
Superuser created successfully.

Process finished with exit code 0

【三】依赖于auth_user表完成登录注册功能

【1】基础登陆

  • 路由
path('login/', views.login),
  • 前端
<form action="" method="post">
    {#  取消crsf校验  #}
    {% csrf_token %}
    <p>username:<input type="text" name="username"></p>
    <p>password:<input type="text" name="password"></p>
    <input type="submit" class="btn btn-success">
</form>
  • 后端
from django.shortcuts import render
from django.contrib import auth


# Create your views here.
def login(request):
    if request.method == 'POST':
        # (1) 取到前端输入的用户名和密码
        username = request.POST.get('username')
        password = request.POST.get('password')
        # (2) 进行用户名和密码的校验
        # 从用户表中获取数据
        # --- 1、表如何获取
        # --- 2、表中的密码是密文,如何比对
        # 导入 auth 校验模块 : from django.contrib import auth
        user_obj = auth.authenticate(request, username=username, password=password)
        # [1] 用户名和密码正确的情况下
        print(user_obj)  # dream ---- 这是用户对象内部封装的一个方法 __str__ 方法
        print(user_obj.username)  # dream
        print(user_obj.password)  # pbkdf2_sha256$260000$011PbZAjKIWBfAUJ61Rcyn$vNUYq5L70/ljTLEeJ2dBJtDTEKFDTKzFioFPjZYMdU4=
        # [2] 用户名和密码不正确的情况下
        print(user_obj)  # None ---- 如果数据不符合则返回None

        '''
        【1】自动查找 auth_user 表
        【2】自动给密码加密进行比对
        注意事项:
            参数必须传入用户名和密码
            不能只传入一个用户名(一步就帮助我们筛选出用户数据)
        '''

    return render(request, 'login.html')

【2】保存用户状态

  • 如果使用auth模块,就使用其中所有封装好的方法
    • 如果不想使用,就单独封装方法,不要调用其中的方法
  • auth.login(request, user_obj)
    • 类似于 request.session[key] = user_obj
    • 只要执行了上面的方法,就可以在任何地方通过 request.user 获取当前用户的登录对象
from django.shortcuts import render
from django.contrib import auth


# Create your views here.
def login(request):
    if request.method == 'POST':
        # (1) 取到前端输入的用户名和密码
        username = request.POST.get('username')
        password = request.POST.get('password')
        # (2) 进行用户名和密码的校验
        # 从用户表中获取数据
        # --- 1、表如何获取
        # --- 2、表中的密码是密文,如何比对
        # 导入 auth 校验模块 : from django.contrib import auth
        user_obj = auth.authenticate(request, username=username, password=password)

        # 判断当前用户是否存在 --- 存在则有值,不存在则返回None
        if user_obj:
            # 保存用户状态
            auth.login(request, user_obj)  # 类似于 request.session[key] = user_obj
             # 只要执行了上面的方法,就可以在任何地方通过 request.user 获取当前用户的登录对象


        '''
        【1】自动查找 auth_user 表
        【2】自动给密码加密进行比对
        注意事项:
            参数必须传入用户名和密码
            不能只传入一个用户名(一步就帮助我们筛选出用户数据)
        '''

    return render(request, 'login.html')

【3】登录后跳转

from django.shortcuts import render, redirect, HttpResponse
from django.contrib import auth


# Create your views here.
def login(request):
    if request.method == 'POST':
        # (1) 取到前端输入的用户名和密码
        username = request.POST.get('username')
        password = request.POST.get('password')
        # (2) 进行用户名和密码的校验
        # 从用户表中获取数据
        # --- 1、表如何获取
        # --- 2、表中的密码是密文,如何比对
        # 导入 auth 校验模块 : from django.contrib import auth
        user_obj = auth.authenticate(request, username=username, password=password)

        # 判断当前用户是否存在 --- 存在则有值,不存在则返回None
        if user_obj:
            # 保存用户状态
            auth.login(request, user_obj)  # 类似于 request.session[key] = user_obj
            # 只要执行了上面的方法,就可以在任何地方通过 request.user 获取当前用户的登录对象
            # 登陆成功后跳转页面
            return redirect('/home/')

        '''
        【1】自动查找 auth_user 表
        【2】自动给密码加密进行比对
        注意事项:
            参数必须传入用户名和密码
            不能只传入一个用户名(一步就帮助我们筛选出用户数据)
        '''

    return render(request, 'login.html')

def home(request):
    print(request.user)  # dream ---- 这是用户对象内部封装的一个方法 __str__ 方法
    print(request.user)
    # 登陆成功: dream ---- 这是用户对象内部封装的一个方法 __str__ 方法
    # 未登录访问: AnonymousUser ---- 匿名用户
    # 本质上是自动去django_session里面查找到当前用户对象,然后封装到 request.user 中
    return HttpResponse("OK")
  • 判断用户是否登录
def home(request):
    print(request.user)
    # 登陆成功: dream ---- 这是用户对象内部封装的一个方法 __str__ 方法
    # 未登录访问: AnonymousUser ---- 匿名用户
    # 本质上是自动去django_session里面查找到当前用户对象,然后封装到 request.user 中
    # 判断用户是否登陆
    print(request.user.is_authenticated()) # 匿名用户返回 False

    return HttpResponse("OK")

(1)登录后才能访问页面 -- 局部配置

from django.contrib.auth.decorators import login_required


# 添加装饰器 --- 指定未登录的跳转页面
@login_required(login_url='/login/') # 局部配置
def home(request):
    '''用户登录后才能访问的页面'''
    print(request.user)
    # 登陆成功: dream ---- 这是用户对象内部封装的一个方法 __str__ 方法
    # 未登录访问: AnonymousUser ---- 匿名用户
    # 本质上是自动去django_session里面查找到当前用户对象,然后封装到 request.user 中
    # 判断用户是否登陆
    print(request.user.is_authenticated())  # 匿名用户返回 False

    return HttpResponse("OK")
http://127.0.0.1:8000/accounts/login/?next=/home/

(2)登录后才能访问页面 -- 全局配置

  • settings 文件中添加
LOGIN_URL = '/login/'
from django.contrib.auth.decorators import login_required


# 添加装饰器 --- 指定未登录的跳转页面
@login_required
def home(request):
    '''用户登录后才能访问的页面'''
    print(request.user)
    # 登陆成功: dream ---- 这是用户对象内部封装的一个方法 __str__ 方法
    # 未登录访问: AnonymousUser ---- 匿名用户
    # 本质上是自动去django_session里面查找到当前用户对象,然后封装到 request.user 中
    # 判断用户是否登陆
    print(request.user.is_authenticated())  # 匿名用户返回 False

    return HttpResponse("OK")

@login_required
def index(request):
    return HttpResponse("index")

(3)小结

  • 局部/全局优先级

    • 局部大于全局
  • 各自的优点

    • 全局的好处在于无需书写重复的代码,但是页面的跳转很单一
    • 局部的好处是在于不同的视图函数再用户没有登陆的情况下可以跳转到不同的页面

【三】修改密码

  • 路由
# 修改密码
path('set_password/', views.set_password),
  • 后端
@login_required
def set_password(request):
    if request.method == 'POST':
        old_password = request.POST.get('old_password')
        new_password = request.POST.get('new_password')
        confirm_password = request.POST.get('confirm_password')
        # 先校验两次密是否一致
        if new_password == confirm_password:
            # 校验旧密码是否相同
            is_right = request.user.check_password(old_password)  # 内部自己加密密码进行比对
            # 返回的结果为  True 或者 False
            if is_right:
                # 修改密码
                request.user.set_password(confirm_password) # 仅仅在修改对象的属性
                # 修改完密码后进行保存数据
                request.user.save()

        return redirect('/login/')

    return render(request, 'set_password.html', locals())
  • 前端
<form action="" method="post">
    {#  取消crsf校验  #}
    {% csrf_token %}
    <p>username:<input type="text" name="username" disabled value="{{ request.user.username }}"></p>
    <p>old_password:<input type="text" name="old_password"></p>
    <p>new_password:<input type="text" name="new_password"></p>
    <p>confirm_password:<input type="text" name="confirm_password"></p>
    <input type="submit" class="btn btn-success">
</form>

【四】注销

  • 路由
# 注销用户
path('login_out/', views.login_out),
  • 后端
@login_required
def login_out(request):
    auth.logout(request)  # 清空当前登录用户的数据 ----- request.session.flush()
    return redirect('/login/')

【五】注册功能

  • 路由
# 注册用户
path('register/', views.register),
  • 后端
def register(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        confirm_password = request.POST.get('confirm_password')
        # 操作auth_user表写入数据
        # User.objects.create(username=username, password=confirm_password)  # 会写入数据,但是保存的密码是明文的,没有加密
        # 创建普通用户
        User.objects.create_user(username=username, password=confirm_password)
        # 创建超级用户 - 了解 --- 使用代码创建超级用户,邮箱和密码是必填的,而用命令创建可以忽略邮箱
        # User.objects.create_superuser(username=username, password=password,email=email)
    return render(request, 'register.html')

【六】方法总结

【1】校验密码是否正确

from django.contrib import auth
# (1) 取到前端输入的用户名和密码
username = request.POST.get('username')
password = request.POST.get('password')
# (2) 进行用户名和密码的校验 ---- 参数必须传用户名和密码
user_obj = auth.authenticate(request, username=username, password=password)


# [1] 用户名和密码正确的情况下
print(user_obj)  
# dream ---- 这是用户对象内部封装的一个方法 __str__ 方法
print(user_obj.username)  
# dream
print(user_obj.password)  
# pbkdf2_sha256$260000$011PbZAjKIWBfAUJ61Rcyn$vNUYq5L70/ljTLEeJ2dBJtDTEKFDTKzFioFPjZYMdU4=

# [2] 用户名和密码不正确的情况下
print(user_obj)  # None ---- 如果数据不符合则返回None

【2】保存用户状态

# 判断当前用户是否存在 --- 存在则有值,不存在则返回None
if user_obj:
    # 保存用户状态
    auth.login(request, user_obj)  # 类似于 request.session[key] = user_obj
    # 只要执行了上面的方法,就可以在任何地方通过 request.user 获取当前用户的登录对象

【3】判断当前用户是否登录

# 判断用户是否登陆
# 匿名用户返回 False  正常用户返回 True
print(request.user.is_authenticated())  

【4】获取当前登录的用户

print(request.user)
# 登陆成功: dream ---- 这是用户对象内部封装的一个方法 __str__ 方法
# 未登录访问: AnonymousUser ---- 匿名用户
# 本质上是自动去django_session里面查找到当前用户对象,然后封装到 request.user 中

【5】检验用户是否登录装饰器

from django.contrib.auth.decorators import login_required
  • (1)局部配置

  • (2)全局配置

  • (3)全局/局部的优缺点

【6】校验原密码

# 校验旧密码是否相同
is_right = request.user.check_password(old_password)  # 内部自己加密密码进行比对
# 返回的结果为  True 或者 False

【7】修改密码

# 修改密码
request.user.set_password(confirm_password)  # 仅仅在修改对象的属性
# 修改完密码后进行保存数据
request.user.save()

【8】注销登录用户

auth.logout(request)  
# 清空当前登录用户的数据 ----- request.session.flush()

【9】注册

# 操作auth_user表写入数据
# 会写入数据,但是保存的密码是明文的,没有加密
User.objects.create(username=username, password=confirm_password) 
# 创建普通用户
User.objects.create_user(username=username, password=confirm_password)
# 创建超级用户 - 了解 --- 使用代码创建超级用户,邮箱和密码是必填的,而用命令创建可以忽略邮箱
User.objects.create_superuser(username=username, password=password,email=email)

【七】扩展 auth_user

【1】方式一

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


# Create your models here.
# 扩展 auth_user 表
# 第一种方式 : 一对一关系(不推荐)
class UserDetail(models.Model):
    phone = models.CharField(max_length=32)
    user = models.OneToOneField(to='User', on_delete=models.CASCADE)

【2】方式二

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

# 第二种方式 : 面向对象的继承
class UserInfo(AbstractUser):
    '''
    如果继承了AbstractUser
    那么在执行数据库迁移命令的时候,auth_user表就不会被创建
    而 UserInfo 会在 auth_user表 的基础上添加自定义扩展的字段

    优点:
        直接通过自己定义的表快速完成操作及扩展

    前提
        (1)在执行之前没有执行过数据库迁移命令
            auth_user 表没有被创建
            如果当前库已经被创建,则需要更换新的库
        (2)继承的表里面不要覆盖 AbstractUser 里面的字段名
            表里面有的字段不要动,只扩展额外的字段即可
        (3)需要再配置文件中声明Django要使用 UserInfo 替代 auth_user
            AUTH_USER_MODEL = 'app01.UserInfo'  ---'应用名.表名'
    '''
    phone = models.CharField(max_length=32)
  • 需要再配置文件中声明 Django 要使用 UserInfo 替代 auth_user
 AUTH_USER_MODEL = 'app01.UserInfo'  ---'应用名.表名'
  • 如果自己写表代替了 auth_user
  • auth模块功能正常使用,参考的表也由 auth_user 变成了 UserInfo

标签:username,25.0,request,用户,auth,Django,user,password
From: https://www.cnblogs.com/dream-ze/p/18119656

相关文章

  • 【26.2】Django框架之settings核心配置项
    【一】前言【1】引言Django的默认配置文件中,包含上百条配置项目其中很多是我们‘一辈子’都不碰到或者不需要单独配置的这些项目在需要的时候再去查手册。【2】强调配置的默认值不是在settings.py文件中!不要以为settings.py中的配置值就是默认值,参考前文。settings.py......
  • Django单程序运行
    1、增加环境变量并且配置#确保运行在最model类之前importosimportdjangoos.environ.setdefault('DJANGO_SETTINGS_MODULE','SmsProject.settings')django.setup()2、如果使用Pycharm还需要做如下配置3、运行程序importosimportdjangoos.environ.setdefault(......
  • Gitlab接入Oauth2.0
    配置Gitlab的SSO接入文档OmniAuthOauth2.0添加Gitlab配置里面包含的JWT配置后续再添加样例,可以忽略gitlab_rails['omniauth_enabled']=true#启用SSO配置gitlab_rails['omniauth_auto_link_user']=["oauth2_generic"]#自动关联已经存在的账号gitlab_rails[......
  • 物流系统django版本
    1,创建modelspyfromdjango.dbimportmodelsclassGoods(models.Model):  id=models.AutoField(primary_key=True)  name=models.CharField('货物名称',default='',max_length=50)  source=models.CharField('渠道',max_length=......
  • Java/Mysql数据库+django学生就业管理系统 24237(免费领源码)计算机毕业设计项目推荐上
    学生就业管理系统摘 要随着社会的快速发展和人们生活水平的不断提高,旅游已逐渐成为人们生活的重要组成部分,用户能够获取旅游信息的渠道也随信息技术的广泛应用而增加。大量未经过滤的信息在展示给用户的同时,也淹没了用户真正感兴趣的信息。为了方便用户快速定位自己感兴趣......
  • python计算机毕设【附源码】便利店收银管理系统(django+mysql+论文)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着社会的发展和经济的进步,便利店作为一种新型的零售业态在城市中迅速崛起。便利店以其便捷的地理位置、丰富的商品种类和高效的服务赢得了消费者的青睐。......
  • Django框架之ORM操作
    一、选择数据库1、默认数据库Django默认的数据库是sqlite3数据库DATABASES={'default':{'ENGINE':'django.db.backends.sqlite3','NAME':BASE_DIR/'db.sqlite3',}}2、指定数据库修改连接到MySQL数据库DATABASES......
  • Django框架之请求生命周期流程图
    一、引言WSGI、wsgiref、uwsgi三者是什么关系?WSGI是协议,小写的wsgiref和uwsgi是实现该协议的功能模块缓存数据库提前已经将你想要的数据准备好了,需要的时候直接拿就可以,提高了效率和响应时间。eg:当你在修改你的数据的时候,你会发现数据并不是立刻修改完成的,而是需要经......
  • Django框架之路由层
    一、路由匹配1、什么是路由在计算机领域中,路由(Routing)通常指的是确定数据包在网络中传输的路径的过程。当数据包从源主机发送到目标主机时,路由是决定数据包应该沿着哪条路径传输的方法。路由器是负责执行这种路由功能的设备。在Web开发中,路由通常指的是将特定的URL请求映射到相......
  • python基于flask汽车4s店服务销售配件管理系统django+echart 数据可视化_od8kr
     该系统采用python技术,结合flask框架使页面更加完善,后台使用MySQL数据库进行数据存储。系统主要分为三大模块:即管理员模块,员工管理模块和用户模块。本文从汽车服务流程分析入手,分析了其功能性需求和非功能性需求,设计了一个由管理员,用户和员工三部分组成的汽车服务管理系统。用......