• 41.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_authenticated
      
      # 为何执行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页面,那么我需要写好多份

    若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' 并传递当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。 LOGIN_URL = '/login/' # 这里配置成你项目登录页面的路由

    
    * 回到最上面,我们是怎么对auth_user表添加数据的?命令行输入~~~合理不?
    
    ```python
    from django.contrib.auth.models import User
    def register(request):
      User.objects.create()  # 不能用这个,因为密码是明文
      User.objects.create_user()  # 创建普通用户
      User.objects.create_superuser()  # 创建超级用户
    
    • 校验密码,修改密码

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

    自定义模型表应用auth功能

    如何扩张auth_user表?

    • 一对一关联(不推荐)

      from django.contrib.auth.model s 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表的操作方法,现在全部用自定义的表均可实现
      """
      

    forms组件

    -Django提供的用于数据校验和模板渲染的组件
    -在项目中创建一个py文件
    	-1 写一个类继承Form
    	-2 在类中写属性,写的属性,就是要校验的字段
    	-3 使用:生成一个你写的类的对象myform,把要校验的数据(字典),传到对象中:MyForm(字典)
    		-数据多?数据少?数据多可以,少不行(required控制)
    	-4 myform.is_valid() 是True表示所有字段都通过校验
    	-5 myform.cleaned_data:是一个字典,所有通过校验的数据放在里面
    	-6 myform.errors:是一个字典,所有的错误字段的信息
    -在模板中:
    	-{{myform.name}}
    	-{%for item in myform%}
    		{{item.label}}:{{item}}
    	 {%endfor%}
    	-myform.as_table/as_p/as_ul(不推荐使用)
    
  • 相关阅读:
    JavaScript内置对象
    微信小程序:实现可拖动悬浮图标(包括按钮角标的实现)
    项目1——博客系统
    在HTML中使用css3实现雪人动画效果
    Ajax请求后台发送String类型总是进入Error function解决办法总结
    原生js实现图片懒加载
    【Electron Playground 系列】自定义协议篇
    大规格文件的上传优化
    如何优雅的在react-hook中进行网络请求
    noip2008 双栈排序
  • 原文地址:https://www.cnblogs.com/yellowcloud/p/11374111.html
Copyright © 2020-2023  润新知