设为首页 收藏本站
查看: 623|回复: 1

Django之auth模块

[复制链接]
累计签到:528 天
连续签到:1 天
发表于 2022-11-5 19:42:04 | 显示全部楼层 |阅读模式
# Auth模块简介
其实我们在创建好一个django项目时候执行迁移命令会自动执行很多表
    django_session
    auth_user
django在启动之后就可以访问admin路由,需要输入用户名和密码,数据参考的就是auth_user表
并且还必须是管理员用户才能进入
[创建超级用户(管理员)]
1、python manage.py createsuperuser
2、一般用tools工具manage执行createsuperuser
[后端代码]
注册用户名和密码
from django.contrib.auth.models import User
def register(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 操作auth_user表写入数据
        # User.objects.create(username=username,password=password) # 这种写入数据密码不是加密,后面通过auth是比对密码会报错的
        # 创建普通用户
        # User.objects.create_user(username=username,password=password)
        # 创建超级用户(一般不会暴露给用户)
        User.objects.create_superuser(username=username,email='123@qq.com',password=password)# 使用代码创建的超级用户邮箱是必填的
    return render(request,'register.html')

登录校验账户密码、保存用户状态
from django.contrib import auth
def login(request):
    if request.method == 'POST':
        username=request.POST.get('username')
        password=request.POST.get('password')
        # 去用户表中校验数据
        # 1、表如何获取
        # 2、密码如何比对
        user_obj = auth.authenticate(request,username=username,password=password)
        # print(user_obj)# 用户对象 里面定义一个双下str方法 zheng  数据不符合则返回None
        # print(user_obj.username)# 用户名 zheng
        # print(user_obj.password)# 用户密码 pbkdf2_sha256$36000$fOsEpX97UZwU$HssyGIDaJIgto6jg73i2tW6E3gJqija4QIJHeWvzfqs
        # 判断用户是否存在
        if user_obj:
            # 保存用户状态
            auth.login(request,user_obj) # 类似与request.session[key] = user_obj
            # 虽然自己也可以自己保存session  但事实我们使用auth模块要用就用全套

            # 只要执行了这个方法,就可以在任何地方通过request.user获取到当前登录的用户对象
            return redirect('/home/')
        """
        1、自动查找auth_user
        
        2、自动给密码加密比对
        该方法的注意事项:
            括号内必须同时传入用户名和密码
            不能只传入用户名(一步就帮你筛选出用户加对象)
        """
    return render(request,'login.html')
校验用户是否登录、装饰器
from django.contrib.auth.decorators import login_required
# @login_required(login_url='/login/') # 局部配置:用户没有登录跳转到login_user指定网址
# @login_required # 全局配置 在settings LOGIN_URL = '/login/'
# @login_required(login_url='/xxx/') # 优先级  局部>全局
@login_required  # 全局配置
def home(request):
    """登录之后才能看home"""
    # 自动去django_session里面查找对应的用户对象给你封装到request.user
    print(request.user) # 用户对象  AnonymousUser 匿名用户
    # 判断用户是否登录
    print(request.user.is_authenticated())
    return HttpResponse('ok')

"""
1、如果局部和全局都有 该听谁的呢?
    局部>全局
2、全局和局部哪个好呢?
    全局的好处无需重复写代码,但是跳转的页面比较单一
    局部的好处不同的视图在用户没有登录下可以自定义跳转不同的页面"""
单独校验密码、修改密码、保存数据库
@login_required
def set_password(request):
    if request.method =='POST':
        # username = request.POST.get('username')
        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一般都是布尔值
            # 密码在数据库是密文的,我们学的auth校验数据的方式只有一种authenticated一种,而且还是必须要上传usernamepassword同时的
            is_right = request.user.check_password(old_password) # 自动加密再去校验
            # 修改密码
            if is_right:
                request.user.set_password(new_password) # 相当于是事务的提交
                request.user.save() # 这一步才是操作数据库
                return redirect('/login/')
            return HttpResponse('原密码错误')
        return HttpResponse('两次密码不一致')
    return render(request,'set_password.html',locals())
auth方法总结
[1、比对用户名和密码是否正确]
去用户表中校验数据
1、表如何获取
2、密码如何比对
user_obj = auth.authenticate(request,username=username,password=password)[括号内必须同时传入账号和密码]
print(user_obj)# 用户对象 里面定义一个双下str方法 zheng  数据不符合则返回None
print(user_obj.username)# 用户名 zheng
print(user_obj.password)# 用户密码 pbkdf2_sha256$36000$fOsEpX97UZwU$HssyGIDaJIgto6jg73i2tW6E3gJqija4QIJHeWvzfqs
        # 判断用户是否存在
        if user_obj:
[2、保存用户状态]
auth.login(request,user_obj) # 类似与request.session[key] = user_obj
只要执行了这个方法,就可以在任何地方通过[request.user获取到当前登录的用户对象]
return redirect('/home/')

[3、判断当前用户是否登录]
request.user.is_authenticated() #返回布尔值

[4、获取当前登录用户]
request.user
1、存在就是登录用户
2、不存在即使匿名用户

[5、校验用户是否登录装饰器]
    from django.contrib.auth.decorators import login_required
    [局部配置]
    @login_required(login_url='/login/')
    [全局配置settings中
    LOGIN_URL='/LOGIN/'
    1、如果局部和全局都有 该听谁的呢?
        局部>全局
    2、全局和局部哪个好呢?
        全局的好处无需重复写代码
        局部的好处不同的视图在用户没有登录下可以跳转不同的页面

[6、比对原密码]
request.user.check_password(old_password)

[7、修改密码]
request.user.set_password(new_password) 仅仅是修改
request.user.save()

[8、注销密码]
auth.logout(request)

[9、注册]
    1、不是加密,后面通过auth是比对密码会报错的
    User.objects.create(username=username,password=password)
    2、创建普通用户
    User.objects.create_user(username=username,password=password)
    3、创建超级用户,邮箱必填
    User.objects.create_superuser(username=username,email='123@qq.com',password=password)
自定义auth_user表及拓展字段
# 如何扩展auth_user表
from django.contrib.auth.models import User,AbstractUser
但是要注意,User被替换了,那么就意味着你不用导入django表了,直接使用from app01 import models 然后models.Userinfo
[第一种通过外键字段,可以把两个表合成一个表增加字段,但是不推荐,太麻烦]
class UserDetail(models.Model):
    phone = models.BigIntegerField()
    user= models.OneToOneField(to='User')

[第二种:通过面向对象的继承]
class UserInfo(AbstractUser):
    phone=models.BigIntegerField()
    create_time = models.DateTimeField(auto_now_add=True)
如果没有继承了AbstractUser
那么在执行数据库迁移的时候auth_user表会被UserInfo表顶替掉,不会再创建出来了
并且UserInfo里面结成了auth_user中所有字段,并且还可以自定义去拓展字段
前提:
    [1]、在继承之前不能执行迁移命令,就是auth_user表没有被创建出来,如果创建出来]
就只能重新换一个库
    [2]、继承的类里面不要覆盖Abstract里面的字段名,不要和以前的字段重复
        表里面的字段不要动,有其他功能绑定了
    [3、需要在配置文件中告诉django你要用UserInfo替代auth_user]
        AUTH_USER_MODEL = 'app01.UserInfo'
                            '应用名.表名'
[3、非常重要]
需要在配置文件中告诉django你要用UserInfo替代auth_user
    AUTH_USER_MODEL = 'app01.UserInfo'
                        '应用名.表名'


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-1002638-1-1.html 上篇帖子: Python深入了解中间件及插拔式思想 下篇帖子: 一、BBS项目表搭建、Form表单注册功能
累计签到:528 天
连续签到:1 天
 楼主| 发表于 2022-11-5 19:57:57 | 显示全部楼层
[如何创建超级用户/管理员]
python manage.py createsuperuser
from django.contrib import auth
[1、校验用户名和密码是否正确]
auth.authenticate(request,username=username,password=password)
注意用户名和密码都需要给否则报错,该方法有一个返回值,用户对象/None
[2、保存用户信息/状态]
auth.login(request,user_obj)
内部自动操作session表,把request.session[key]=user_obj
该方法执行完毕,可以在任意位置可以通过request.user获得到当前用户对象
[3、判断当前用户是否登录]
request.user.is_authenticated()
返回的是布尔值
[4、校验用户登录装饰器]
from django.contrib.auth.decorators import login_required
    -[1、局部配置]
        @login_required(login_url='/login/')
    -[2、全局配置]   
        settings中写入LOGIN_URL='/login/'
    -[优先级]
        局部>全局
    -[各个好处]
        局部扩展性强(自定义url跳转为位置)
        全局代码简化
[5、验证原密码是否正确]
request.user.check_password(old_password)
[6、修改密码]
request.user.set_password(new_password)
request.user.save()
[7、创建用户]
from django.contrib.auth.models import User
    1、User.objects.create()  密码不加密、不用
    2、User.objects.create_user()  创建普通用户
    3、User.objects.create_superuser() 创建超级用户 该方法邮箱必填,命令行创建邮箱可以不填

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表