首页 > 其他分享 >Django之auth认证模块

Django之auth认证模块

时间:2023-05-08 19:22:39浏览次数:33  
标签:username request auth Django user 模块 login

目录

前戏:

django自带一个admin路由 但是需要我们提供管理员账号和密码
image
如果想要使用admin后台管理 需要先创建表 然后创建管理员账号,直接执行数据库迁移命令即可产生默认的auth_user表 该表就是admin后台管理默认的认证表
image

auth模块封装了cookie和session还有很多之前学过的方法,只需要学会如何使用auth模块,如何调用它封装的方法即可
如何创建创建超级管理员?

python38 manage.py createsuperuser

image
不能直接在终端建普通用户

auth模块的使用

基于auth_user表编写用户相关的各项功能,这里就需要借助于auth模块
登录、校验用户是否登录、修改密码、注销登录等

接下来就介绍auth模块的方法如何使用,主要实现下面这几个功能,URL视图层显示:

  # auth用户注册
    path('register/', views.register_func),
    # auth用户登录
    path('login/', views.login_func),
    # 网站首页
    path('home/', views.home_func),
    # index页面 只有登录的用户才可以看
    path('index/', views.index_func),
    # auth用户修改密码
    path('set_pwd/', views.set_pwd_func),
    # auth用户退出登录
    path('logout/', views.logout_func)

auth之用户注册

在写方法之前,需要先导入两个模块

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

views函数

def register_func(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 1.校验用户名是否存在    res = <QuerySet [<User: yzk>]>
        res = User.objects.filter(username=username)
        if res:
            return HttpResponse('该用户已经存在')
        # 2.注册该用户
        # create方法不可以使用,因为密码不加密
        # User.objects.create(username=username, password=password)
        # create_user方法会自动对密码加密
        User.objects.create_user(username=username, password=password)
    return render(request, 'registerPage.html')

html页面

<form action="" method="post">
    {% csrf_token %}
    <p>
        username:
        <input type="text" name="username">
    </p>
    <p>
        password:
        <input type="text" name="password">
    </p>
    <input type="submit">
</form>

auth模块之登录

request.user方法介绍

该方法如果用户是登录过后,则是用户对象,如果没有登录,则是匿名用户

request.user.is_authenticated

判断当前用户是否已经登录,返回是bool值
views视图函数

def login_func(request):
    print(request.user)
    print(request.user.is_authenticated)
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 1.校验用户名和密码是否正确(不分开校验) 自己无法比对密码 必须要使用auth模块提供的方法才可以
        # 这里是方法里面调用了__str__魔法,返回一个真实的登录对象名字
        user_obj = auth.authenticate(request, username=username, password=password)
        # print(user_obj)    # yzk1
        # print(user_obj.username)   # yzk1
        # print(user_obj.password)   # pbkdf2_sha256$150000$1M0w3apWMYbt$Qno5MJoPyOTkGVUQOdCi5PK0G21RLq62RCHjljB/AYg=
        if user_obj:
            # 2.用户登录成功(返回给客户端登录的凭证、令牌、随机字符串)
            auth.login(request, user_obj)   # 自动操作django_session表
            '''
            当执行完上述的操作之后 我们就可以通过request.user直接获取当前登录的用户对象数据
            '''
            return HttpResponse('登录成功')


    return render(request, 'loginPage.html')

html页面

<form action="" method="post">
    {% csrf_token %}
    <p>
        username:
        <input type="text" name="username">
    </p>
    <p>
        password:
        <input type="text" name="password">
    </p>
    <input type="submit">
</form>

auth模块之网页首页

views视图函数

def home_func(request):
    print(request.user.is_authenticated)
    print(request.user)
    return render(request, 'homePage.html', locals())

html页面

    {% if request.user.is_authenticated %}
        <h1>{{ request.user.username }}</h1>
        {% else %}
        <a href="">注册</a>
        <a href="">登录</a>
    {% endif %}

auth模块之用户登录过直接跳转页面

需要导入装饰器
校验用户是否登录装饰器

from django.contrib.auth.decorators import login_required
@login_required(login_url='/login/')  局部配置 
@login_required			全局配置
 配置文件中LOGIN_URL = '/login/'

出现找到页面的问题,所以导入装饰器的时候,要指定路径
image

views视图函数

from django.contrib.auth.decorators import login_required

@login_required(login_url='/login/')   # 可以明确指定用户没有登录之后跳转到哪个地址
def index_func(request):
    return HttpResponse('index页面 只有登录的用户才可以查看')

auth模块之用户修改密码

views视图函数层

@login_required(login_url='/login/')
def set_pwd_func(request):
    if request.method == 'POST':
        old_pwd = request.POST.get('old_pwd')
        new_pwd = request.POST.get('new_pwd')
        confirm_pwd = request.POST.get('confirm_pwd')
        if not new_pwd == confirm_pwd:
            return HttpResponse('两次密码不一致')
        # 1.判断原密码是否正确
        is_right = request.user.check_password(old_pwd)
        if not is_right:
            return HttpResponse('原密码不正确')
        # 2.修改密码
        request.user.set_password(new_pwd)
        request.user.save()     # 一定要保存 否则不会修改
        return HttpResponse('修改密码成功')

    return render(request, 'setPage.html')

html

<form action="" method="post">
    {% csrf_token %}
    <p>原密码:
        <input type="text" name="old_pwd">
    </p>
    <p>新密码:
        <input type="text" name="new_pwd">
    </p>
    <p>确认密码:
        <input type="text" name="confirm_pwd">
    </p>
    <input type="submit">

auth模块之注销用户

views视图函数

@login_required
def logout_func(request):
    auth.logout(request)
    return HttpResponse('退出登录')

auth模块之扩展表

还想使用auth模块的功能 并且又想扩展auth_user表的字段

  • 思路1:一对一字段关联(外键)

  • 思路2:替换auth_user表
    步骤1:模型层编写模型类继承AbstractUser

      from django.contrib.auth.models import AbstractUser
     class UserInfo(AbstractUser):
      # 填写AbstractUser表中没有的字段
      phone = models.BigIntegerField()
      desc = models.TextField()
    

    步骤2:一定要在配置文件中声明替换关系

      AUTH_USER_MODEL = 'app01.UserInfo'
    

    ps:替换还有一个前提 就是数据库迁移没有执行过(auth相关表没有创建)

标签:username,request,auth,Django,user,模块,login
From: https://www.cnblogs.com/nankeloveiu/p/17382880.html

相关文章

  • Django面试题
    1.DjangoORM查询中select_related和prefetch_related的区别??defselect_related(self,*fields)性能相关:表之间进行join连表操作,一次性获取关联的数据。总结:1.select_related主要针一对一和多对一关系进行优化。2.select_related使用SQL的JOIN语句进行......
  • Python模块面试题
    1.列举常用的模块。基础:os,sys,time,datetime,json,pickle,randon,hashlib,re,math,logging爬虫:requests,BeautifulSoup,xpath,gevent,asyncio,twisted数据分析:pandas,numpy,scipy,matplotlib,seaborn等。。。2.如何安装第三方模块?pip3install模块名称3.re的ma......
  • kali Metasploit导入模块
    比如对于漏洞CyberLinkLabelPrint2.5-StackBufferOverflow(Metasploit)-WindowslocalExploit(exploit-db.com)首先从Exploit-DB下载45985.rb文件,该文件是ruby写的metasploit模块,用来复现攻击将模块复制到metasploit的渗透攻击模块目录cd/usr/share/metasploit-fr......
  • python Django校验表单登录案例
    定义一个视图函数,用于处理登录表单的提交动作。在该视图函数中,使用request.POST.get()方法获取POST请求中提交的用户名和密码数据,具体代码如下:fromdjango.shortcutsimportrender,redirectfromdjango.contrib.authimportauthenticate,logindeflogin_view(requ......
  • 电力电子相关仿真,并网逆变器仿真有模块版本,和c语言版本,方便移植。
    电力电子相关仿真,并网逆变器仿真有模块版本,和c语言版本,方便移植。并网逆变器模型预测电流控制仿真,有单矢量,双矢量三矢量等多种。ID:6699672831165332......
  • 采用simulink仿真嵌入C语言实现了逆变器的搭建,整个仿真没有一个模块,所有算法均用C语言
    采用simulink仿真嵌入C语言实现了逆变器的搭建,整个仿真没有一个模块,所有算法均用C语言实现,并对C语言代码给出了详尽的注释。逆变器输出的电压THD仅有0.4%。可以根据这个例子写自己的算法,并把在simulink中写的代码直接移植到DSP或者别的控制器中的中断中,不需要做任何修改。ID:55200......
  • Django-Vue-Admin基于django+vue前后端分离开箱即用框架
    平台简介......
  • MFC-GetModuleHandle获取动态链接库的模块句柄
     HMODULEhmodule=::GetModuleHandle(_T("kernel32.dll"));//获取动态链接库的模块句柄/*参数:LPCTSTR指向含有模块名称字符串的指针返回值:HMODULE,如执行成功成功,则返回模块句柄。零表示失败。获取错误信息*/     ......
  • 8-1 OAuth2的主要角色和流程
         ......
  • 深度操作系统 deepin 20.8 定制的 SSH 安全模块问题
    近期由于工作需求,尝试使用国产化操作系统,由于对Debian系统的偏爱,选择了深度操作系统,使用的版本是Deepin20.8,安装使用基本顺利,没什么大问题。但由于这个环境是面向公网的,总是免不了大量的攻击类SSH登录尝试,发现深度好像定制修改了安全防护这块,当SSH密码登录错误达到指定次......