首页 > 其他分享 >auth组件

auth组件

时间:2024-03-28 15:58:38浏览次数:18  
标签:username request auth user 组件 login password

 

 

我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,内置了强大的用户认证系统--auth,是一个app

 

其实我们在创建好一个django项目之后直接执行数据库迁移命令会自动生成很多表
django_session
auth_user
django在启动之后就可以直接访问admin路由,需要输入用户名和密码,数据参考的就是auth_user表,并且还必须是管理员用户才能进入

创建超级用户(管理员)

python3 manage.py createsuperuser

 



依赖于auth_user表完成用户相关的所有功能

内置属性方法

  

  数据迁移以后使用

  authenticate用户认证,比对用户名和密码是否正确

from django.contrib import auth
def login(request):
    if request.method=='GET':
        return render(request,'login.html')
    else:
        name=request.POST.get('name')
        password=request.POST.get('password') # 明文
        ## 方案行不通,密码是密文的,永远匹配不成功
        # user=User.objects.filter(username=name,password=password)
        ## 使用此方案
        ## 第一个参数必须是request对象
        ##username和password
        user=auth.authenticate(request,username=name,password=password)
        if user:
            return HttpResponse('登录成功')
        else:
            return HttpResponse('用户名或密码错误')

 

 

扩展默认的auth_user表

 

login

# 表示用户登录了
# 1 存了session
# 2 以后所有的视图函数,都可以使用request.user,它就是当前登录用户

保存用户状态

auth.login(request,user_obj) # 类似于request.session[key] = user_obj

 


# 主要执行了该方法 你就可以在任何地方通过request.user获取到当前登陆的用户对象

from django.contrib.auth.models import User
from django.contrib import auth
def index(request):
    if request.method=='GET':
        return render(request,'login.html')
    else:
        name=requesr.POST.get('name')
        password=request.POST.get('password')
        user=auth.authenticate(request,username=name,password=password)
        if user:
            return HttpResponse('登录成功')
        else:
            return HttpResponse('用户名或密码错误')



def order(request):
    print(request.user)
    return render(request,'order.html')

 

login.html:

{% csrf_token %}
<form action="" mthod="post">
    <p>用户名:<input type="text" name="name"></p>
    <p>密码:<input type="password" name="password"></p>
    <p><input type="submit" value="提交"></p>
</form>

 

order.html:

<body>
<p1>{{ request.user.username }} 登录了</p1>
</body>

 

logout:

def logout(request):
# 后续再访问视图函数,就没有当前登录用户了request.user(匿名用户AnonymousUser)
auth.logout(request)
return redirect('/index/')

 

 

 

 

is_authenticated:一般用在模板中,查看用户是否登录

# is_authenticated 返回True或者False,判断用户是否登录
# 用在视图中
if request.user.is_authenticated:
print('用户登录了')
else:
print('用户没有登录,匿名用户')

 

# 用在模板中

{% if request.user.is_authenticated %}
{{ request.user.username }} 登录了
{% else %}
<a href="/login/">滚去登录</a>
{% endif %}

 

 

获取当前登陆用户
request.user

 

 

login_requierd

获取当前登陆用户

装饰器,装饰再视图函数上,只要没有登录,就进不来,

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

 


1.如果局部和全局都有 该听谁的?
局部 > 全局
2.局部和全局哪个好呢?
全局的好处在于无需重复写代码 但是跳转的页面却很单一
局部的好处在于不同的视图函数在用户没有登陆的情况下可以跳转到不同的页面


# 必须登录后才能访问
@login_required(login_url='/login/')


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

from django.contrib.auth.decorators import login_required
@login_required
def index(request):
if request.method=='GET':
return render(request,'login.html')
else:
name=requesr.POST.get('name')
password=request.POST.get('password')
user=auth.authenticate(request,username=name,password=password)
if user:
auth.login(request,user)
url=request.GET.get('next')
if uel:
return redirect(url)
else:
return redirect('/index/')
else:
return HttpResponse('用户名或密码错误')


@login_required(login_url='/login/')
def order(request):
print(request.user)
return render(request,'order.html')
 

 

 比对原密码

request.user.check_password(old_password)

 

 

 

create_user/create_superuser:

创建用户的功能(注册)

# 使用内置的create_user或者create_superuser方法
user=User.objects.create_user(username=name,password=password)
# user=User.objects.create_superuser(username=name,password=password)

from django.contrib.auth.models import User
def register(request):
    if request.method == 'GET':
        return render(request, 'register.html')
    else:
        name = request.POST.get('name')
        password = request.POST.get('password')
        user = User.object.create_user(username=name, password=password)
        # auth.login(request,user) 如果需要注册后立马跳转登录后的首页进入,就这样写
        return dedirect('/login/')

 

 

 

 

比对原密码

check_password

在登录失败时显示密码错误这种详细提示可以使用

## 有了用户,校验密码是否正确
# 先获取到用户对象
user = User.objects.filter(username=name).first()
# 判断密码是否正确
flag=user.check_password(password)

 

 

 

修改密码:

def change_password(request):
    if request.method == 'GET':
        return render(request, 'change_pwd.html')
    else:
        old_pwd = request.POST.get('old_pwd')
        new_pwd = request.POST.get('new_pwd')
        re_new_pwd = request.POST.get('re_new_pwd')
        if request.user.check_password(old_pwd):
            # 密码正确再修改
            request.user.set_password(new_pwd)
            # 记住保存(****)  新密码要核验
            request.user.save()
            return redirect('/login/')
        else:
            return HttpResponse('原来密码错误')
change_pwd.html:
{% if request.user.is_authenticated %}
{{ request.user.username }} 登录了
<a href="/change_pwd/"></a> 
#这里需要用反向解析
{% else %} <a href="/login/">滚去登录</a> {% endif %}
<br>


 

 

User对象的属性

is_staff : 用户是否拥有网站的管理权限,是否可以登录到后台管理
is_superuser:是否是超级管理员(如果is_staff=1,可以任意增删查改任何表数据)
is_active : 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录(三次密码输入错误禁用用户)

 

扩展默认的auth_user表

1 内置的auth_user表,要加字段,加不了,扩展该表
-方式一:一对一
-方式二,通过继承

# 方式二:通过继承,一定要记住再setting中配置
## 重点:使用这种方式,一开始就要用

from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
# id=models.AutoField(primary_key=True)
# username = models.CharField(max_length=128)
phone = models.CharField(max_length=32)
addr = models.CharField(max_length=32)

 

from django.db import models
from django.contrib.auth.models import User,AbstractUser
# Create your models here.

# 第一种:一对一关系  不推荐
# class UserDetail(models.Model):
#     phone = models.BigIntegerField()
#     user = models.OneToOneField(to='User')


# 第二种:面向对象的继承
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.BigIntegerField()
    
详细使用

 



## setting.py中写:
AUTH_USER_MODEL = "app01.User" 这里是app名字+类名

 

如果项目一开始没有扩展auth_user表,后期想扩展的操作步骤

 

1 备份--删库---》重新创建出数据库
2 所有app的数据迁移记录删除migrations下除了__init__.py都删除
3 (重要)去源码中删除auth和admin 这俩app的migrations下除了__init__.py都删除
4 数据迁移,同步到数据库
5 备份的数据,恢复回去

 

 

 

注册

注册
# 操作auth_user表写入数据
User.objects.create(username=username,password=password)  # 写入数据  不能用create 密码没有加密处理
# 创建普通用户
User.objects.create_user(username=username,password=password)
# 创建超级用户(了解):使用代码创建超级用户 邮箱是必填的 而用命令创建则可以不填
User.objects.create_superuser(username=username,email='[email protected]',password=password)

 

标签:username,request,auth,user,组件,login,password
From: https://www.cnblogs.com/97zs/p/17919047.html

相关文章

  • 在Vue项目中使用Vuex进行状态管理是一种常见做法。下面是一个简单的示例,展示了如何创
    步骤1:创建VuexStore首先,你需要创建一个Vuexstore。通常,这是在你的项目的store目录下完成的。//store.jsimportVuefrom'vue';importVuexfrom'vuex';Vue.use(Vuex);conststore=newVuex.Store({state:{count:0},mutations:{increment(......
  • 前端组件wolfTable中关于表格冻结部分的说明
    在wolfTable中,可以使用冻结表格,这样就可以达成类似下拉滚动条的时候始终显示前几行的功能。 在这里,用组件自带的案例代码来做说明import'@wolf-table/table/dist/table.min.css';importTablefrom"@wolf-table/table";constt=Table.create('#table',()=>14......
  • vue3子组件给父组件传参,父组件给子组件传参,在父组件中直接调用子组件中的某个方法
    vue3子组件给父组件传参,父组件给子组件传参,在父组件中直接调用子组件中的某个方法1、子传父,以传递id为例子:constemit=defineEmits(['passId']);//在需要传递的参数的地方写,id为需要传递的参数emit('passId',id); 父://引入子组件constSonPage=defineAsyncCo......
  • vue/react- 报错Unable to authenticate, need: BASIC realm=“Sonatype Nexus Reposi
    问题描述在vue/react(node.js)项目中,node安装依赖install装包时报错:Unabletoauthenticate,need:BASICrealm=“SonatypeNexusRepositoryManager“如果我们报错差不多,就可以完美解决。解决方法这个问题,其实......
  • 深入浅出:探索Hadoop生态系统的核心组件与技术架构
    目录前言HDFSYarnHiveHBaseSpark及SparkStreaming书本与课程推荐关于作者:推荐理由:作者直播推荐:前言进入大数据阶段就意味着 进入NoSQL阶段,更多的是面向OLAP场景,即数据仓库、BI应用等。大数据技术的发展并不是偶然的,它的背后是对于成本的考量。集中式数据库或......
  • 【Vue】 签名组件
    一、需求背景:检查业务,检查完成后,执行人需要签字证明检查完成 二、实现效果: 三、技术实现通过canvas转换成blob对象,可以上传到文件服务,或者是下载另存为到本地磁盘注意重点,canvas的样式的宽高和dom对象宽高一定要一致才可以,否则无法在面板绘制线条!<template><el-dia......
  • 第四章(页面组件)总结
    4.1一组件的定义及属性组件是页面视图层(WXML)的基本组成单元,组件组合可以构建功能强大的页面结构。小程序框架为开发者提供了容器视图、基础内容、表单、导航、多媒体、地图、画布、开放能力等8类(30多个)基础组件。每一个组件都由一对标签组成,有开始标签和结束标签,内容放置在开......
  • 使用可迭代对象作为 React 组件
    源码最近看React源码的时候发现其在处理数组的同时也对可迭代协议做了处理,因此React组件可以是一个返回可迭代对象的函数。源码如下:reconcileChildFibersImplif(isArray(newChild)){returnreconcileChildrenArray(returnFiber,currentFirstChild,newChild,lanes,......
  • 深入理解 Vue 3.0 宏函数:提升组件代码的工程化与可维护性
    Vue3.0宏函数详解:defineProps、defineEmits、defineExpose、defineSlots和defineOptions在Vue3.0中,为了更好地组织和维护组件代码,引入了几个新的宏函数。这些宏函数包括defineProps、defineEmits、defineExpose、defineSlots和defineOptions。本文将详细介绍这五......
  • 第4章 页面组件
    一. 组件的定义及属性    1.1 语法格式如下: <标签名  属性名=“属性值” >内容....</标签名>  id 组件的唯一表示,保持整个页面唯一,不常用class 组件的样式类,对应WXSS中定义的样式  style组件的内联样式,可以动态设置内联样式......