zoukankan      html  css  js  c++  java
  • Django -- Auth模块

    Auth模块

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

    auth模块方法

    # 1.比对用户名和密码是否正确
    user_obj = auth.authenticate(request,username=username,password=password)
    # 括号内必须同时传入用户名和密码
    print(user_obj)  # 用户对象    数据不符合则返回None
    print(user_obj.username)  
    print(user_obj.password)  # 密码是密文形式
    
    # 2.保存用户状态
    auth.login(request,user_obj)  # 类似于request.session[key] = user_obj
    
    
    # 3.判断当前用户是否登陆
    request.user.is_authenticated()
    
    # 4.获取当前登陆用户
    request.user
    
    # 5.校验用户是否登陆装饰器
    from django.contrib.auth.decorators import login_required
    # 局部配置
    @login_required(login_url='/login/') 
    # 全局配置
    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.注册
    # 操作auth_user表写入数据
    User.objects.create(username=username,password=password)  # 写入数据  密码没有加密处理
    # 创建普通用户
    User.objects.create_user(username=username,password=password)# 密码是加密处理的
    # 创建超级用户:使用代码创建超级用户 邮箱是必填的 而用命令创建则可以不填
    User.objects.create_superuser(username=username,email='123@qq.com',password=password)

    例子:

    def login(request):
        if request.method == "POST":
            username = request.POST.get("username")
            pwd = request.POST.get("password")
            obj = auth.authenticate(request, username=username, password=pwd)
            print(obj)
            print(obj.username)
            print(obj.password)
            if obj:
                auth.login(request, obj)
                return redirect("/home/")
        return render(request, "login.html")
    login
    @login_required
    def home(request):
        print(request.user)
        print(request.user.is_authenticated())
        return HttpResponse("ok")
    home
    @login_required
    def set_pwd(request):
        if request.method == "POST":
            old_pwd = request.POST.get("old_password")
            new_pwd = request.POST.get("new_password")
            re_pwd = request.POST.get("re_password")
            if new_pwd == re_pwd:
                obj = request.user.check_password(old_pwd)
                if obj:
                    request.user.set_password(new_pwd)
                    request.user.save()
            return redirect("/login/")
        return render(request,"set_pwd.html")
    set_pwd
    @login_required
    def logout(request):
        auth.logout(request)
        return redirect("/login/")
    logout

    扩展auth_user表

     前提:
            1.在继承之前没有执行过数据库迁移命令
               
            2.继承的类里面不要覆盖AbstractUser里面的字段名
                
            3.需要在配置文件中告诉django你要用UserInfo替代auth_user
                AUTH_USER_MODEL ='应用名.表名'

    两种创建方法:

    from django.db import models
    from django.contrib.auth.models import User,AbstractUser
    
    
    # 第一种:一对一关系  
    # class UserDetail(models.Model):
    #     phone = models.BigIntegerField()
    #     user = models.OneToOneField(to='User')
    
    
    # 第二种:面向对象的继承
    class UserInfo(AbstractUser):
        phone = models.BigIntegerField()
  • 相关阅读:
    svn备份
    Java Web开发引用包的方法
    nucht1.2二次开发增量采集
    程序集信息设置.net
    lucene的基本查询及lucene3.0.1API
    Asp.net网站部署
    C语言面试算法题(一)
    面试题
    C语言面试算法题(二)
    C++的IO流的函数
  • 原文地址:https://www.cnblogs.com/zhenghuiwen/p/13081636.html
Copyright © 2011-2022 走看看