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)登陆用户
这个函数使用Django
的session
框架给某个已认证的用户附加上session_id
信息。
使用:
from django.shortcuts import render,redirect,HttpResponsefrom django.contrib.auth import authenticate,logindef 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,HttpResponsefrom django.contrib.auth import authenticate,login,logoutdef 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_requireddef 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 Useruser=User.objects.get(username="username") # 获取用户对象user.set_password(password="password") # 设置对象的密码user.save()
check_password(password)
用户想修改密码的时候,首先要让用户输入原来的密码。
如果用户输入的旧密码通过密码验证,返回True。
例子一,使用set_password()
方法来修改密码
from django.shortcuts import render,redirect,HttpResponsefrom django.contrib.auth.models import Userdef create_user(request):msg=Noneif 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,HttpResponsefrom django.contrib.auth import authenticate,login,logoutfrom django.contrib.auth.decorators import login_requiredfrom django.contrib.auth.models import User@login_requireddef change_passwd(request):user=request.user # 获取用户名msg=Noneif 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})
转载于:https://www.cnblogs.com/renpingsheng/p/7629997.html
Django内置的用户认证相关推荐
- python对文件操作的相关函数_python文件操作的相关函数深入理解Django中内置的用户认证...
前言 本文主要给大家介绍了关于Django中内置用户认证的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 认证登陆 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查 ...
- Django内置权限扩展案例
当Django的内置权限无法满足需求的时候就自己扩展吧~ 背景介绍 overmind项目使用了Django内置的权限系统,Django内置权限系统基于model层做控制,新的model创建后会默认新建 ...
- Django内置Admin
Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP:django.contrib.authdjango.contrib.contenttypes ...
- django 内置 admin
Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件使用方式有依赖APPdjango.contrib.authdjango.contrib.contenttypesdjan ...
- 〖Python〗-- Django内置Admin
[Django内置Admin] Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP:django.contrib.authdjango.cont ...
- Django - 内置admin
Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有:复制代码依 ...
- django 内置标签与过滤器
#内置标签与过滤器 本文档介绍了Django的内置模板标签和过滤器. 我们推荐尽可能使用 自动文档,同时也可以自行编辑任何已安装的自定义标签或过滤器的文档. ##内置标记引用 ###autoescap ...
- Django内置的分页模块
自定义分页 未封装版: 优点:直观 缺点:代码乱,不易维护,可拓展性差 data = []for i in range(1, 302):tmp = {"id": i, " ...
- 用Django内置form组件实现注册
HTML页面代码块: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta char ...
最新文章
- 聊聊企业级 Java 应用最重要的4个性能指标
- asp.net在线压缩和解压缩的实现
- csgo如何保存自己的cfg_KXCSGO:CSGO开箱饰品交易方法
- 【必看】如何向女朋友解释TCP的三次握手和四次挥手
- 已锁定计算机,计算机锁定怎么解除_计算机已锁定如何解除
- 理解Joomla!模板
- webpack打包css文件
- MIT6.830 lab5 B+ Tree Index 实验报告
- EDA技术实用教程 | 复习七 | 异步清零和同步清零的时序设计
- 信号课组(一) 信号与系统 Review 1 信号与系统综述
- 浅谈-国标GB28181协议上下级对接国标编码要求(四)
- sql server2008导入文本文件
- IP地址,子网掩码,网络地址,直接广播地址,网络位主机位的计算
- 五大领域总目标指南_五大领域总目标记忆口诀
- Ubuntu配置静态IP以及interfaces配置不生效问题解决
- 计算机u盘病毒清除方式,彻底清除u盘病毒有什么方法呢
- 苏格拉底谈爱情、婚姻、外遇与生活
- oracle按序号排序,Oracle排序以及序号的显示
- webstorm打开项目不显示文件夹
- 一篇13年前的采访|庚顿首席科学家孙宝元:从数据融合起步,瞄准创造价值,打造助力智能化生产的利器
热门文章
- POJ-2728 Desert King 最优比例生成树 01分数规划/参数搜索
- android 定时打电话教程
- Flink SQL的N way join
- Flink SQL Client讀取csv中的數據(轉載+總結)
- intellij设置java中的代码中的import不折叠
- 'module' object has no attribute 'Env'
- ubuntu linux下面运行《暗黑破坏神2》和英雄无敌3-死亡阴影
- python 的几个内置函数(lambda ,zip, filter, map, reduce )用法
- python怎么对齐文件_说说在 python 中,如何对齐文本
- idea 修改Git密码和账号方法