41.django中auth用户认证

Auth认证模块

执行数据库迁移的那两条命令时,即便咱们没有建表,django是否是也会建立好多张表?咱们建立以后去看一下里面的一个叫auth_user表,既然是表,那确定应该有对应的操做改表的方法前端

auth_user表记录的添加python

  • 建立超级用户(不可手动插入,由于密码是加密的)数据库

  • 简单使用auth认证django

    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也给你提供了一个比较好用的方法cookie

    if user:
      # 等价于request.session['name']=name
      auth.login(request,user)  # 登录,其实就把用户信息放到session中,跑一下验证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中,点进去看一下这个中间件确实如此
  • 注销app

    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页面,那么我须要写好多份ui

    若用户没有登陆,则会跳转到django默认的 登陆URL '/accounts/login/ ' 并传递当前访问url的绝对路径 (登录成功后,会重定向到该路径)。若是须要自定义登陆的URL,则须要在settings.py文件中经过LOGIN_URL进行修改。  LOGIN_URL = '/login/' # 这里配置成你项目登陆页面的路由
  • 回到最上面,咱们是怎么对auth_user表添加数据的?命令行输入~~~合理不?

    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(不推荐使用)
相关文章
相关标签/搜索