首页 > 其他分享 >Auth模块的使用

Auth模块的使用

时间:2023-08-11 20:45:03浏览次数:29  
标签:username request auth Auth 模块 使用 login password user

Auth模块的使用

Auth模块:Auth模块是Django自带的用户认证模块

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

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

在执行数据库迁移命令的时候,会自动生成一个默认的表,其中有auth_开头的很多表
auth_user表的作用:djagno自带的后台管理系统所依赖的数据就在这张表中
默认情况下,auth_user表是空表,没有用户名和密码,因此我们需要自己创建用户数据
需要创建一个超级管理员账号才能登录:python36 manage.py createsuperuser

Auth模块的相关方法

登录功能:

##########################auth模块登录功能
# 导入Auth模块
from django.contrib import auth
def login(request):
    if request.method == 'POST':
        # 从前端接受数据
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 验证用户名和密码是否正确
        '''
           这里的登录,我们使用auth模块,登录的时候所使用的表是auth_user表
        '''
        user_obj=auth.authenticate(request,username=username,password=password)
        print(user_obj) # 得到的是登录成功之后的用户对象:hua,当查询不到的时候返回结果是None
        print(user_obj.username)
        print(user_obj.password)
        """
           注意事项:传递参数的时候,用户名和密码必须同时传入
        """
        #要么全部使用auth模块的方法,要么全部自己写,,一定别混合使用
        if user_obj:
            # 存在则保存用户的状态:
            auth.login(request,user_obj) # 相当于自动保存session:request.session['username'] = user_obj.usernane
           '''只要写了auth.login,那么就可以在全局任何有request对象第地方通过request.user拿到用户的对象'''
    return render(request,'login.html')

结果:

 验证是否登录:

当给order函数加了装饰器:@login_required  (这里是局部设置

# 验证是否登录成功
from django.contrib.auth.decorators import login_required
@login_required 
def order(request):
    # 验证用户是否已经登录
    # print(request.user.is_authenticated()) #is_authenticated()判断是否认证,登录即认证 # True:用户已登录
    # # 不加括号的结果:CallableBool(True) #  django2中不用加括号:is_authenticated
    # if request.user.is_authenticated():
    #     # 处理登录之后的逻辑
    #     pass
    # else:
    #     # 没有登录,跳转到登录页面
    return HttpResponse('order')

结果:当没有登录的时候,会跳转到:http://127.0.0.1:8000/accounts/login/?next=/order/

 

当给函数装了装饰器并指定了跳转路由:login_url='/login/',局部设置,只对当前函数起作用

from django.contrib.auth.decorators import login_required
@login_required(login_url='/login/') # 局部设置:只对当前函数起作用,会跳转到指定路由
def order(request):
    return HttpResponse('order')

@login_required
def order1(request):
    return HttpResponse('order1')

结果:

order路由:

 

order1路由:

 全局设置:在配置文件中修改 添加:LOGIN_URL = '/login/' # 全局配置

 

@login_required
def order1(request):
    return HttpResponse('order1')

再次访问order1的结果:

当做了全局设置,但是在order函数处做了局部设置,访问order:

from django.contrib.auth.decorators import login_required
@login_required(login_url='/order/login/') # 局部设置:只对当前函数起作用,会跳转到指定路由
def order(request):

    return HttpResponse('order')

结果:会执行局部设置的路由

 当局部和全局都存在的时候,按照局部的路由执行;如果局部没有,就按照全局的

Auth模块之退出系统

# 退出系统
def logout(request):
    # 看自己保存的是哪种,是哪种就清楚哪种(cookie/session)
    #这边使用的是auth,所以我们清楚auth
    auth.logout(request) # logout内部其实是做session清除,需要request
    return redirect('/home/')

Auth模块之修改密码功能

#修改密码,需要在登录状态下
@login_required
def set_password(request):
    # 从前端获取输入的旧密码,新密码
    if request.method == 'POST':
        oid_password = request.POST.get('old_password')
        new_password = request.POST.get('new_password')
        re_password = request.POST.get('re_password')
        # 先验证两次输入的密码是否一致
        if new_password == re_password:
            # 验证旧密码是否一致
            is_right= request.user.check_password(oid_password)
            if is_right:
                # 修改密码
                request.user.set_password(new_password) # 仅这一步并没有真正的操作数据库
                request.user.save()
                return redirect('/home/')
    return render(request,'set_password.html')

注意:必须执行这两句命令才能真正修改密码

结果:

 

通过后面修改的密码成功登录:

 

Auth模块之注册功能、

# 注册功能:
#先导入这个
from django.contrib.auth.models import User
def register(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 入库
        # User.objects.create(username=username, password=password) # 会自动入库到auth_user表中,但是create创建的密码是明文,登录时会登不进去
        # 用create_user来创建
        # User.objects.create_user(username=username, password=password) # 创建普通用户
        User.objects.create_superuser(username=username, password=password,email='[email protected]') # 超级用户要加email,可以指定,也可以从前端获取
        return redirect('/login/')
    return render(request, 'register.html')

普通用户(0):

 超级用户(1):

扩展默认的auth_user表

默认情况下使用的就是auth_user的默认字段
扩展我们自己的字段

前提是:所有的模型类都继承
from django.contrib.auth.models import AbstractUser

不要继承了models.Model
扩展之后需要在配置文件中加一句话

"""""在扩展表之前数据库不能够迁移,扩展这个表需要在迁移数据库之前做"""""
 如果你迁移了,还想扩展怎么办?
1. 换库
2. 需要删除很多个应用的migrations文件夹

python manage.py migrate myapp --fake

"""
扩展表之后发生的变化:
1. 原来的auth_user表不存在了,换成你自己新建的表名了
2. 原来的auth_user表中的字段还都在,然后多了自己扩展的字段
3. 继承的类要发生改变AbstractUser
4. 在配置文件中加入下面一句话:
AUTH_USER_MODEL = 'app01.UserInfo'
AUTH_USER_MODEL = '应用名.类名'
5. 扩展之后还是按照原来的auth_user表使用
6. auth模块中的数据还是你扩展的表
7. 扩展之前别迁移.
"""

标签:username,request,auth,Auth,模块,使用,login,password,user
From: https://www.cnblogs.com/Lucky-Hua/p/17623901.html

相关文章

  • 使用dockerfile 新创建一个flask工程的镜像
    项目工程格式如下   1.写一个flask功能app/app.pyfromflaskimportFlaskapp=Flask(__name__)@app.route("/index")defindex():return"HelloWorld!"if__name__=="__main__":app.run(host='0.0.0.0',port=8000)......
  • 不使用循环语句用if和else实现循环
    如果不使用循环语句,可以使用递归函数来实现循环的效果。递归函数是指在函数内部调用自身的函数。下面是一个使用递归函数来实现循环的示例:(初学者记得写include,这里是个普通函数,所以我没写)defloop(count):ifcount<5:ifcount%2==0:......
  • 使用WPF构建响应式桌面应用程序
    当构建响应式桌面应用程序时,WPF(WindowsPresentationFoundation)是一个强大的工具,它允许你创建现代、交互式和具有吸引力的用户界面。在本博客中,我们将探讨如何使用WPF构建响应式桌面应用程序,并提供一些示例代码来帮助你入门。什么是WPF?WPF是一种用于创建Windows桌面应用程序的技术......
  • 使用ASP.NET Identity管理用户认证与授权
    当开发涉及用户认证与授权的网站或应用程序时,ASP.NETIdentity是一个强大的工具,可以帮助你管理用户的身份验证和授权需求。它提供了一套易于使用且高度可定制的功能,让你可以轻松地实现用户管理功能。在本博客中,我们将探讨如何使用ASP.NETIdentity来管理用户认证与授权。什么是......
  • wix中,传参给c#扩展的customAction的 使用笔记
    即时的CA不可回滚,但是能直接在c#里用session["属性名称"]访问上下文的属性如果是延迟执行的CA,需要通过customActionData<!--id需要一样--><CustomActionid="xxx"Execute="deferred"..../><PropertyId="xxx"Value="Arg1=111;Arg2=222;......
  • 多线程开发 使用Semaphore和BoundedSemaphore对象
    数据库mportthreadingimporttimedeffunc(semaphore:threading.Semaphore,num):#获得信号量,信号量-1semaphore.acquire()print(f"打印信号量:第{num}次")time.sleep(3)#释放信号量,信号量+1semaphore.release()if__name__=='__ma......
  • ACCESS 禁止用户使用SHIFT启动数据库
    这是官方链接,不要去各种百度了: 在数据库中强制实施或禁用启动选项-Office|MicrosoftLearn'1.启动访问。'2.创建新模块,然后添加以下两个函数:Functionap_DisableShift()'Thisfunctiondisabletheshiftatstartup.Thisactioncauses'theAutoexecmacroandS......
  • Git的基本使用
    此次仿真试验主要集中于gitee上进行1、单人项目开发  gitadd.                //表示将所有代码提交至暂存区     gitcommit-m"提交信息"  //将代码提交至本地仓库,注意提交的附加信息不可或缺     gitpu......
  • ffmpeg使用avformat_close_input()函数释放结构体时崩溃的问题
    先看一下我调试时,发现程序崩溃的代码位置  //这是我的程序释放流上下文时的操作 if(m_pAvFormatContext) { //释放视频解码器上下文 if(m_iVideoStreamIndex>=0) avcodec_free_context(&m_pVideoDecodeContext);//此处是发生崩溃......
  • 使用nginx进行负载均衡
    目录1、nginx负载均衡介绍2、nginx负载均衡策略我使用了三台VPS服务器,同一网段的,用来搭建网站,推荐你们也可以使用3A服务器1、nginx负载均衡介绍nginx应用场景之一就是负载均衡。在访问量较多的时候,可以通过负载均衡,将多个请求分摊到多台服务器上,相当于把一台服务器需要承担的负......