Django内置的用户认证

简介: 认证登陆在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中;如果用户存在于数据库中,然后再验证用户输入的密码,这样一来就要自己编写大量的代码。事实上,Django已经提供了内置的用户认证功能。

认证登陆

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

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

事实上,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         #导入auth模块

django.contrib.auth中提供了很多方法,我们常用的有三个方法:

authenticate()

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

如果通过认证,authenticate()函数会返回一个User对象。

authenticate()函数会在User对象上设置一个属性标识,这个属性标识经过数据库验证用户名及密码。

当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象时会报错。

使用:

    user=authenticate(username="uaername",password="password")
    
    login(HttpResponse,user)

这个函数接受一个HttpRequest对象,以及一个通过authenticate()函数认证的User对象

login(request)登陆用户

这个函数使用Djangosession框架给某个已认证的用户附加上session_id信息。

使用:

    from django.shortcuts import render,redirect,HttpResponse
    
    from django.contrib.auth import authenticate,login
    
    def auth_view(request):
        username=request.POST.GET("usernmae")       # 获取用户名
        password=request.POST.GET("password")       # 获取用户的密码
    
        user=authenticate(username=username,password=password)  # 验证用户名和密码,返回用户对象
    
        if user:                        # 如果用户对象存在
            login(request,user)         # 用户登陆
            return redirect("/index/")
    
        else:
            return HttpResponse("用户名或密码错误")

logout(request)注销用户

这个函数接受一个HttpResponse对象,无返回值。

当调用该函数时,当前请求的session信息全部被清除。

即使当前用户没有登陆,调用该函数也不会报错。

使用:

    from django.shortcuts import render,redirect,HttpResponse
    
    from django.contrib.auth import authenticate,login,logout
    
    def logout_view(request):
        
        logout(request)     # 注销用户
        
        return redirect("/index/")

user对象的is_authenticated()

要求:

  • 用户登陆后才能访问某些页面
  • 如果用户没有登陆就访问本应登陆才能访问的页面时会直接跳转到登陆页面
  • 用户在登陆页面登陆后,又会自动跳转到之前访问的页面

方法一:

    def view1(request):
        
        if not request.user.is_authenticated():
            return redirect("/login/")

方法二:

使用Django的login_requierd()装饰器

使用:

    from django.contrib.auth.decorators import login_required
    
    @login_required
    def views(request):
        pass

如果用户没有登陆,则会跳转到Django默认的登陆URL的"/accountss/login/"

login视图函数可以在settings.py文件中通过LOGIN_URL修改默认值

用户登陆成功后,会重定向到原来的路径。

user对象

User对象属性:username,password为必填项

password用哈希算法保存到数据库中
  • is_staff:判断用户是否拥有网站的管理权限
  • is_active:判断是否允许用户登陆,设置为“False”时可以不用删除用户来禁止用户登陆

User对象的方法

is_authenticated()

如果是通过auth函数返回的真实的User对象,返回值则为True。这个方法检查用户是否已经通过了认证。

is_authenticated()函数的返回值为True时,表明用户成功的通过了认证。

创建用户

使用create_user辅助函数创建用户

from django.contrib.auth.models import User
user=User.objects.create_user(username="username",password="password")

set_password(password)

使用这个方法来修改密码

使用:

    from django.contrib.auth.models import User
    
    user=User.objects.get(username="username")      # 获取用户对象
    user.set_password(password="password")          # 设置对象的密码
    
    user.save()

check_password(password)

用户想修改密码的时候,首先要让用户输入原来的密码。

如果用户输入的旧密码通过密码验证,返回True。

例子一,使用set_password()方法来修改密码

    from django.shortcuts import render,redirect,HttpResponse
    from django.contrib.auth.models import User
    
    def create_user(request):
    
        msg=None
    
        if request.method=="POST":
            username=request.POST.get("username"," ")           # 获取用户名,默认为空字符串
            password=request.POST.get("password"," ")           # 获取密码,默认为空字符串
            confirm=request.POST.get("confirm_password"," ")    # 获取确认密码,默认为空字符串
    
            if password == "" or confirm=="" or username=="":   # 如果用户名,密码或确认密码为空
                msg="用户名或密码不能为空"
            elif password !=confirm:                            # 如果密码与确认密码不一致
                msg="两次输入的密码不一致"
            elif User.objects.filter(username=username):        # 如果数据库中已经存在这个用户名
                msg="该用户名已存在"
            else:
                new_user=User.objects.create_user(username=username,password=password)  #创建新用户 
                new_user.save()
            
                return redirect("/index/")
        
        return render(request,"login.html",{"msg":msg})

例子二,使用login_required装饰器来修改密码

    from django.shortcuts import render,redirect,HttpResponse
    from django.contrib.auth import authenticate,login,logout
    from django.contrib.auth.decorators import login_required
    from django.contrib.auth.models import User
    
    @login_required
    def change_passwd(request):
        user=request.user       # 获取用户名
        msg=None
    
        if request.method=='POST':
            old_password=request.POST.get("old_password","")    # 获取原来的密码,默认为空字符串
            new_password=request.POST.get("new_password","")    # 获取新密码,默认为空字符串
            confirm=request.POST.get("confirm_password","")     # 获取确认密码,默认为空字符串
    
            if user.check_password(old_password):               # 到数据库中验证旧密码通过
                if new_password or confirm:                     # 新密码或确认密码为空
                    msg="新密码不能为空"   
                elif new_password != confirm:                   # 新密码与确认密码不一样
                    msg="两次密码不一致"
    
                else:
                    user.set_password(new_password)             # 修改密码
                    user.save()
    
                    return redirect("/index/")
            else:
                msg="旧密码输入错误"
    
        return render(request,"change_passwd.html",{"msg":msg})
目录
相关文章
|
数据安全/隐私保护 Python
Django用户认证系统
.权限管理 Django利用auth_permission表定义权限 Permission表的定义非常简单,只有三个属性: name:权限显示的名称,最多允许255个字符 content_type:关联ContentType(记录App与model的信息) codename:权限的名称编码,最多允许100个字
121 0
Django用户认证系统
|
数据安全/隐私保护 Python 数据库
Django之路——11 Django用户认证组件 auth
用户认证  auth模块 1 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1.1 、authenticate()    提供了用户认证,即验证用户名以及密码是否正确,一般需要username  password两个关键字参数 如果认证信息有效,会返回一个  User  对象。
1725 0
|
Web App开发 存储 缓存
第20天,Cookie与Session、Django的用户认证、事务
目录 一、Cookie与Session 1.1 概念 1.2 Django实现的cookie 1.2.1 获取Cookie 1.
2339 0
|
数据安全/隐私保护 Python API
django 1.8 官方文档翻译: 13-1-1 Django 中的用户认证
Django 中的用户认证 Django从开始就带有一个用户认证系统。它处理用户账号、组、权限以及基于cookie的用户会话。
1048 0
|
25天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
127 45
|
4月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
192 4
|
26天前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
36 2
|
29天前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
38 1
|
3月前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
128 22
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
2月前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
30 4