• django用户认证之auth模块


    Auth认证模块

    执行数据库迁移的那两条命令时,即使我们没有建表,django是不是也会创建好多张表?我们创建之后去看一下里面的一个叫auth_user表,既然是表,那肯定应该有对应的操作改表的方法

    auth_user表记录的添加

    创建超级用户(不可手动插入,因为密码是加密的)

    简单使用auth认证

    from django.contrib import auth
    
    def login(request):
    
      if request.method == 'POST':
    
        name = request.POST.get('name')
    
        pwd = request.POST.get('pwd')
    
        user = auth.authenticate(request,username=name,password=pwd)
    
        # 类似于user=models.User.objects.filter(username=name,password=pwd).first()
    
        if user:
    
          return redirect('/home/')
    
      return render(request,'login.html')
    
    

    只是简单的验证信息不行,还需要给当前成功登陆的用户保存登陆状态,之前是通过cookie或者session,现在呢,auth也给你提供了一个比较好用的方法

    if user:
    
      # 等价于request.session['name']=name
    
      auth.login(request,user)  # 登陆,其实就把用户信息放到session中,跑一下验证session表
    
    

    上面的验证和登陆其实不是它的亮点,亮点在于

    # 只要登陆成功执行了auth.login(request,user)
    
    # 之后在其他任意的视图函数中都通过request.user获取当前登陆用户对象
    
    ​
    
    # 当没有执行auth.login,request.user打印出来的是匿名用户。将session表数据删除即可演示改效果
    
    # 如何判断request.user用户是否通过auth.login登陆呢?request.user.is_auth
    
    ​
    
    # 为何执行auth.login之后,其他视图函数中就可以通过request.user拿到当前登陆对象呢?因为django的中间件中有一个叫Auth啥的中间件,它取出session去表里面查相应的数据,然后放到request.user中
    
    

    注销

    auth.logout(request)
    
    # 等价于删除session数据request.session.flush()
    
    

    装饰器校验是否登陆及跳转

    from django.contrib.auth.decorators import login_required
    
    ​
    
    @login_required(login_url='/login/',redirect_field_name='old')  # 没登陆会跳转到login页面,并且后面会拼接上你上一次想访问的页面路径/login/?next=/test/,可以通过参数修改next键名
    
    def my_view(request):
    
      pass
    
    

    如果我所有的视图函数都需要装饰并跳转到login页面,那么我需要写好多份

    # 可以在配置文件中指定auth校验登陆不合法统一跳转到某个路径
    
    LOGIN_URL = '/login/'  # 既可以局部配置,也可以全局配置
    
    

    回到最上面,我们是怎么对auth_user表添加数据的?命令行输入~~~合理不?

    from django.contrib.auth.models import User
    
    def register(request):
    
      User.objects.create()  # 不能用这个,因为密码是明文
    
      User.objects.createuser()  # 创建普通用户
    
      User.objects.createsuperuser()  # 创建超级用户
    
    

    校验密码,修改密码

    request.user.check_password(pwd)  # 为什么不直接获取查,因为前端用户输入的是明文数据库密文
    
    ​
    
    request.user.set_password(pwd)
    
    request.user.save()  # 修改密码
    
    

    自定义模型表应用auth功能

    如何扩张auth_user表?

    一对一关联(不推荐)

    from django.contrib.auth.model import User
    
    ​
    
    class UserDetail(models.Models):
    
      phone = models.CharField(max_length=11)
    
      user = models.OnoToOneField(to=User)
    
    

    面向对象的继承

    from django.contrib.auth.models import User,AbstractUser
    
    class UserInfo(AbstractUser):
    
      phone = models.CharField(max_length=32)
    
    ​
    
    
    # 需要在配置文件中,指定我不再使用默认的auth_user表而是使用我自己创建的Userinfo表
    AUTH_USER_MODEL = "app名.models里面对应的模型表名"
    """
    自定义认证系统默认使用的数据表之后,我们就可以像使用默认的auth_user表那样使用我们的UserInfo表了。
    库里面也没有auth_user表了,原来auth表的操作方法,现在全部用自定义的表均可实现
    
    
    
    
  • 相关阅读:
    UVA12125 March of the Penguins (最大流+拆点)
    UVA 1317 Concert Hall Scheduling(最小费用最大流)
    UVA10249 The Grand Dinner(最大流)
    UVA1349 Optimal Bus Route Design(KM最佳完美匹配)
    UVA1212 Duopoly(最大流最小割)
    UVA1395 Slim Span(kruskal)
    UVA1045 The Great Wall Game(二分图最佳匹配)
    UVA12168 Cat vs. Dog( 二分图最大独立集)
    hdu3488Tour(KM最佳完美匹配)
    UVA1345 Jamie's Contact Groups(最大流+二分)
  • 原文地址:https://www.cnblogs.com/zhaogang0104/p/11933927.html
Copyright © 2020-2023  润新知