zoukankan      html  css  js  c++  java
  • Django组件 用户认证,form

    auth模块

    在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中;

    如果用户存在于数据库中,然后再验证用户输入的密码,这样一来就要自己编写大量的代码。

    事实上,Django已经提供了内置的用户认证功能。

    在使用"python manage.py makemigrationss"和"python manage.py migrate"迁移完成数据库之后

    根据配置文件settings.py中的数据库段生成的数据表中已经包含了6张进行认证的数据表,分别是

    • auth_user
    • auth_group
    • auth_group_permissions
    • auth_permission
    • auth_user_groups
    • auth_user_user_permissions

    进行用户认证的数据表为auth_user

    要使用Django自带的认证功能,首先要导入auth模块  from django.contrib import auth

    
    

    django.contrib.auth中提供了许多方法,这里主要介绍其中的三个:

    一、(1)authenticate()

    提供了用户认证,即验证用户名以及密码是否正确,一般需要username  password两个关键字参数

    如果认证信息有效,会返回一个  User  对象。authenticate()会在User 对象上设置一个属性标识那种认证后端认证了该用户,且该信息在后面的登录过程中是需要的。当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象会报错的!!

      user = authenticate(username='someone',password='somepassword') 

    使用Pycharm新建项目authDemo

    执行2个命令,生成django需要的表

    python manage.py makemigrations
    python manage.py migrate

    我们只需要用到auth_user表,就可以了!

    打开auth_user表,默认是空的。其中2个字段,username和password是必须要有的!

    注意:添加用户,不能直接插入记录,必须使用命令行

     创建超级用户

      python manage.py createsuperuser 

    查看auth_user表,发现多了一条记录

    注意:密码是加密的,不能直接查表验证。必须使用authenticate() 进行验证!

    from django.shortcuts import render,HttpResponse,redirect
    from django.contrib import auth
    # Create your views here.
    def login(request):
        if request.method == "POST":
            user = request.POST.get("user")
            pwd = request.POST.get("pwd")
            #用户验证成功,返回user对象,否则返回None
            ret = auth.authenticate(username=user,password=pwd)
            print(ret)
            print(ret.__dict__)
            if ret:
                return redirect("/index/")
    
        return render(request,"login.html")
    
    def index(request):
        return render(request, "index.html")
    视图函数

    (2)login(HttpRequest, user)

    该函数接受一个HttpRequest对象,以及一个认证了的User对象

    此函数使用django的session框架给某个已认证的用户附加上session id等信息。

    from django.shortcuts import render,HttpResponse,redirect
    from django.contrib import auth
    # Create your views here.
    def login(request):
        if request.method == "POST":
            user = request.POST.get("user")
            pwd = request.POST.get("pwd")
            #用户验证成功,返回user对象,否则返回None
            user = auth.authenticate(username=user,password=pwd)
            # print(user)
            # print(user.__dict__)
            if user:
                #登录,注册session
                # 全局变量 request.user=当前登陆对象(session中)
                auth.login(request,user)
                return redirect("/index/")
    
        return render(request,"login.html")
    视图函数

    request.user 默认是一个匿名对象,auth_user表的所有字段对应的值,都是空的。

    当登录成功之后,该对象才会有值。

    request.user是全局变量,可以在任意代码中运用

    它用了一个中间件,在settings.py中的MIDDLEWARE配置项里

    'django.contrib.auth.middleware.AuthenticationMiddleware',

    (3)logout(request) 注销用户

     首页添加注销功能

    该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

    def logout(request):  # 注销
        auth.logout(request)  # 清除session和cookie
        return redirect("/login/")
    View Code

    它其实和session清理类似,也是执行了命令

    request.session.flush()

    但是在清理之前,它做了一些条件判断!

    注销之后,request.user就是匿名用户了!

    注意:user是下面这行代码。变量的名字而已(等式左边的名字)

    user = auth.authenticate(username=user,password=pwd)

    request.user不是固定写法,根据变量名而变化!

    二、User对象

    User对象的属性 

    User对象属性:username, password(必填项)password用哈希算法保存到数据库 

    is_staff : 用户是否拥有网站的管理权限.

    is_active : 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录。

    (1)user对象的 is_authenticated()

     如果是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经通过了认证。
    通过认证并不意味着用户拥有任何权限,甚至也不检查该用户是否处于激活状态,这只是表明用户成功的通过了认证。 这个方法很重要, 在后台用request.user.is_authenticated()判断用户是否已经登录,如果true则可以向前台展示request.user.name

    def index(request):
        print(request.user)  # 默认是一个匿名对象
        print(request.user.id)
        print(request.user.username)
        if not request.user.is_authenticated:
            return redirect("/login/")
        name = request.user.username
        return render(request, "index.html",{"name":name})
    index 函数

    注意:is_authenticated后面是没有括号的,它返回一个布尔值!

    (2) 创建用户

     auth 提供的一个创建新用户的方法,需要提供必要参数(username、password)等。

    from django.contrib.auth.models import User
    user = User.objects.create_user(username='用户名',password='密码',email='邮箱',...)

    auth 提供的一个创建新的超级用户的方法,需要提供必要参数(username、password)等。

    from django.contrib.auth.models import User
    user = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)
  • 相关阅读:
    shell实战
    shell基础
    rpm和yum使用
    用户和用户组的管理
    js Date 时间戳 时区等问题总结
    markdown语法 锚链接实现
    js 通过if变量判断时注意事项
    上传图片过程中,关闭了弹框 如何取消上传
    javascript 导入其他文件的的变量 或函数
    在使用resetField 报错Cannot read property 'indexOf' of undefined
  • 原文地址:https://www.cnblogs.com/Mr-Murray/p/9478588.html
Copyright © 2011-2022 走看看