认证登陆

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

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

事实上,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模块

  1. from django.contrib import auth #导入auth模块

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

authenticate()

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

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

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

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

使用:

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

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

login(request)登陆用户

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

使用:

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

logout(request)注销用户

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

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

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

使用:

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

user对象的is_authenticated()

要求:

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

方法一:

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

方法二:

使用Django的login_requierd()装饰器

使用:

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

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

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

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

user对象

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

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

User对象的方法

is_authenticated()

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

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

创建用户

使用create_user辅助函数创建用户

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

set_password(password)

使用这个方法来修改密码

使用:

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

check_password(password)

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

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

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

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

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

  1. from django.shortcuts import render,redirect,HttpResponse
  2. from django.contrib.auth import authenticate,login,logout
  3. from django.contrib.auth.decorators import login_required
  4. from django.contrib.auth.models import User
  5. @login_required
  6. def change_passwd(request):
  7. user=request.user # 获取用户名
  8. msg=None
  9. if request.method=='POST':
  10. old_password=request.POST.get("old_password","") # 获取原来的密码,默认为空字符串
  11. new_password=request.POST.get("new_password","") # 获取新密码,默认为空字符串
  12. confirm=request.POST.get("confirm_password","") # 获取确认密码,默认为空字符串
  13. if user.check_password(old_password): # 到数据库中验证旧密码通过
  14. if new_password or confirm: # 新密码或确认密码为空
  15. msg="新密码不能为空"
  16. elif new_password != confirm: # 新密码与确认密码不一样
  17. msg="两次密码不一致"
  18. else:
  19. user.set_password(new_password) # 修改密码
  20. user.save()
  21. return redirect("/index/")
  22. else:
  23. msg="旧密码输入错误"
  24. return render(request,"change_passwd.html",{"msg":msg})

Django内置的用户认证的更多相关文章

  1. django内置的认证系统

    Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Djang ...

  2. Django自带的用户认证auth模块

    一.介绍 基本上在任何网站上,都无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能. 使用Django,我们可以不需要自己写这些功能,因为Dj ...

  3. (30)auth模块(django自带的用户认证模块)

    Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的 ...

  4. Django内置权限扩展案例

    当Django的内置权限无法满足需求的时候就自己扩展吧~ 背景介绍 overmind项目使用了Django内置的权限系统,Django内置权限系统基于model层做控制,新的model创建后会默认新建 ...

  5. Django之auth模块用户认证模块

    一.Auth模块 1)auth模块是什么.登录后台使用的账号密码,则就是使用的auth模块创建的表 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站 ...

  6. Django自带的用户认证

    1. 创建超级用户   python manage.py createsuperuser   2. 认证  校验用户名和密码  obj = auth.authenticate(request,user ...

  7. 6月29日学习总结 Django自带的用户认证

    Django自带的用户认证 我们在开发一个网站的时候,无可避免的要设计.实现网站的用户系统.此时我们需要实现包括但不限于用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. D ...

  8. Django内置Admin

    Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP: django.contrib.auth django.contrib.contenttyp ...

  9. Django内置分页

    一.django内置分页 from django.shortcuts import render from django.core.paginator import Paginator, EmptyP ...

随机推荐

  1. 播放视频 IOS 与安卓的不同

    安卓:video IOS:canvas 具体原因请见上传文件“宝马视频安卓与IOS的区别”

  2. 红黑树的插入Java实现

    package practice; public class TestMain { public static void main(String[] args) { int[] ao = {5, 1, ...

  3. 【DDD】领域驱动设计实践 —— 业务建模实例(‘发布帖子’)

    本文是基于上一篇‘业务建模小招数’的实践,后面的多篇博文类似.本文主要讲解‘发表帖子’场景的业务建模,包括:业务建模.业务模型.示例代码:示例代码会使用java编写,文末附有github地址.相比于& ...

  4. The Last

    第八次课程作业 感慨 没想到这就最后一次课程作业了,还以为会跟我到大学毕业呢.既然是最后一次就说说心里话.起初收到做博客作业的消息还觉得蛮有新意的(因为第一次作业不难),后来不断的作业涌现出来了,还都 ...

  5. 【2017集美大学1412软工实践_助教博客】团队作业6——展示博客(Alpha版本)

    题目 团队作业6: http://www.cnblogs.com/happyzm/p/6791211.html 团队成绩 团队成员简介 项目地址 项目目标,包括典型用户.功能描述.预期用户数量 如何满 ...

  6. JAVA基础第九组(5道题)

    41.[程序41] 题目:海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一       个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分成五份,又多了 ...

  7. 结对作业1--基于GUI的四则运算

    201421123002 翁珊,201421123006 黄月梅,201421123007 徐晓珊 题目描述: 我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序.进一步,本次要求把这个程 ...

  8. 作业2——需求分析&原型设计

    需求分析: 软件的最终目的是用来解决用户的某些问题,需求分析就是要理解要解决的问题,真正明确用户需求.下面是我们初步的需求分析: 1.访问软件项目的真实用户(至少10个),确保软件真正体现用户的需求, ...

  9. 201521123081《Java程序设计》 第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 参考资料:XMIND 1.2 选做:收集你认为有用的代码片段 2. 书面作业 本次作业题集 集合 Q1. Li ...

  10. Servlet的生命周期与运行原理

    Servlet的生命周期:    1 加载classLoader    2 实例化 new    3 初始化 init(ServletConfig)    4 处理请求 service doGet d ...