Django 用户认证(auth模块)

一、认证登陆

在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中;如果用户存在于数据库中,然后再验证用户输入的密码,这样一来就需要自己编写大量的代码。实际上,Django已经提供了内置的用户认证功能。在使用"python manage.py makemigrations"和"python manage.py migrate"迁移完成数据库之后,根据配置文件"settings.py"中的数据库段生成的数据表中已经包含了6张进行认证的数据表,分别是:

其中,进行用户认证的数据表为auth_user,要使用Django自带的认证功能,首先需要导入auth模块。

二、auth模块

from django.contrib import auth

1.authenticate():验证用户输入的用户名和密码是否正确

提供了用户认证,即验证用户名和密码是否正确,一般需要username password两个关键字参数。如果认证信息有效,返回User对象。authenticate()会在User对象上设置一个属性标识哪种认证后端认证了该用户,且该信息在后面的登陆过程中是需要的。当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象时会产生错误。

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

2.login(HttpRequest, user):用户登陆

该函数接受一个HttpRequest对象,以及一个认证的User对象,此函数使用Django的session框架给某个已认证的用户附加上session id等信息。

from django.contrib.auth import authenticate, login

def my_view(request):
username = request.POST["username"]
password = request.POST["password"]
user = authenticate(username=username, password=password)
if user:
login(request, user)
# Redirect to a success page.
...
else:
# Return an "invalid login" error message.
...

3.logout(request):注销用户

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

from django.contrib.auth import logout

def my_logout(request):
logout(request)
# Redirect to a success page.

4.User对象的is_authenticated()

  • 1.用户登陆后才能访问某些页面;
  • 2.如果用户没有登陆就访问该页面,直接跳转到登陆页面;
  • 3.用户在跳转的登陆页面中完成登陆后,自动访问跳转到之前访问的地址页面;

方法1:

def custom_view(request):
if not request.user.is_authenticated():
return redirect("%s?next=%s" % (settings.LOGIN_URL, request.path))

方法2:Django已经为我们设计好了一个用于此种情况的装饰器:login_required()

from django.contrib.auth.decorators import login_required

@login_required
def custom_view(request):
...

若用户没有登陆,则会跳转到Django默认的登陆URL"/accounts/login/"(这个值可以在settings文件中通过LOGIN_URL进行修改),并传递当前访问url的绝对路径(登陆成功后,会重定向到该路径)。

三、User对象

  • user对象属性:username、password(必填项)password用哈希算法保存到数据库;
  • is_staff:用户是否拥有网站的管理权限;
  • is_active:是否允许用户登陆,设置为"False",可以不用删除用户来禁止用户登陆;

1.is_authenticated()

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

2.创建用户:create_user

from django.contrib.auth.models import User

user = User.objects.create_user(username="", password="", email="")

3.密码检查:check_password(password)

用户需要修改密码的时候,首先输入原来的密码,如果给定的字符串通过了密码检查,返回True;

4.修改密码:set_password()

user = User.objects.get(username="username")    # 获取用户对象
user.set_password(password="password") # 设置对象密码
user.save()

四、简单示例

1.登陆

def log_in(request):
print(request.POST)
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
print(username, password)
user = auth.authenticate(username=username, password=password) # 验证用户名和密码
if user:
# 如果认证成功,允许登陆;该login里面包括了session和cookie
auth.login(request, user)
return redirect("/login/")
else:
msg = "用户名或密码错误"
return render(request, "login.html", {"msg": msg})
return render(request, "login.html")

2.修改密码

def change_pwd(request):
if request.method == "POST":
old_passwd = request.POST.get("old_passwd")
new_passwd = request.POST.get("new_passwd")
# 得到当前登陆的用户,判断旧密码是不是和当前的密码一样
username = request.user # 当前登陆的用户名
user = User.objects.get(username=username) # 查看用户
result = user.check_password(old_passwd) # 检查密码是否正确
if result:
user.set_password(new_passwd) # 如果密码正确,则设置新密码
user.save() # 保存新密码
return redirect("/login/")
else:
msg = "密码输入有误"
return render(request, "set_passwd.html", {"msg": msg})
return render(request, "set_passwd.html")

3.注册和注销

def register(request):
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
# 得到用户输入的用户名和密码创建新的用户
User.objects.create_user(username=username, password=password) # User是一个对象
msg = "注册成功,恭喜!"
return redirect("/login/")
return render(request, "register.html") def log_out(request):
auth.logout(request)
return redirect("/login/")

Django 2.0 学习(17):Django 用户认证(auth模块)的更多相关文章

  1. Django【第9篇】:Django之用户认证auth模块

    用户认证--------------auth模块 一.auth模块 from django.contrib import auth 1 .authenticate()   :验证用户输入的用户名和密码 ...

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

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

  3. Django之用户认证—auth模块

    用户认知———auth模块 目录: auth模块 User对象 实例 扩展默认的auth_user表 - 创建超级用户 - python3 manager.py createsuperuser - 认 ...

  4. Django框架----用户认证auth模块

    一.auth模块 auth模块:针对auth_user表 创建超级管理用户命令: Python manage.py createsuperuser添加用户名添加密码(至少8位)确认密码添加邮箱(可为空 ...

  5. Django之用户认证auth模块

    一 Django中的auth模块: 我们在使用模块之前要先导入模块: from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介 ...

  6. 用户认证--------------auth模块

    一.auth模块 from django.contrib import auth 1 .authenticate()   :验证用户输入的用户名和密码是否相同 提供了用户认证,即验证用户名以及密码是否 ...

  7. 用户认证--auth模块实现

    转载文章,如有不妥之处请谅解 相关介绍 auth auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理. auth可以和admin模块配合使用, 快速建立网站的管 ...

  8. 用户认证auth模块

    一.auth模块 from django.contrib import auth 1 .authenticate()   :验证用户输入的用户名和密码是否相同 提供了用户认证,即验证用户名以及密码是否 ...

  9. Django之用户认证auth模块使用

    Auth认证模块 执行数据库迁移的那两条命令时,即使我们没有建表,django是不是也会创建好多张表?我们创建之后去看一下里面的一个叫auth_user表,既然是表,那肯定应该有对应的操作改表的方法 ...

随机推荐

  1. 试用一下markdown

    1 2 3 4 5 6 Blog

  2. 解决 mybatis 的覆盖问题 以及避免手写大量mapper的方法

    只需要先实现覆盖不追加的方法: 然后再把所有需要改动mapper的方法抽离出来即可

  3. bootstrap 4 panels已被card替换

    https://www.zhihu.com/question/34838389?sort=created 解决问题的思路不对,不应该搜不到就各种着急,应该理清思路, 既然 bootstrap4没有了3 ...

  4. 我们一起学习WCF 第一篇初识WCF(附源码供对照学习)

    前言:去年由于工作需要我学习了wcf的相关知识,初期对wcf的作用以及为何用怎么样都是一知半解,也许现在也不是非常的清晰.但是通过项目对wcf的运用在脑海里面也算有了初步的模型.今天我就把我从开始wc ...

  5. 跟浩哥学自动化测试Selenium -- Selenium简介 (1)

    Selenium 简介 Selenium 是一款开源的web自动化测试工具,用来模拟对浏览器的操作(主要是对页面元素的操作),简单来讲,其实就是一个jar包.Selenium早期的版本比如1.0市场占 ...

  6. 使用Photon引擎进行unity网络游戏开发(四)——Photon引擎实现网络游戏逻辑

    使用Photon引擎进行unity网络游戏开发(四)--Photon引擎实现网络游戏逻辑 Photon PUN Unity 网络游戏开发 网络游戏逻辑处理与MasterClient 网络游戏逻辑处理: ...

  7. PHP性能优化 -实战篇

    借助xhprof 工具分析PHP性能 XHPorf(源自Fackbook 的PHP性能分析工具) 实战     通过分析Wordpress程序,做优化! 优化 找到需要优化的函数 grep 'impo ...

  8. Amazon Headlines Update on Activity in US West Coast Ports

    According to news reports, freighter cargo may not be offloaded at U.S. West Coast ports from Februa ...

  9. Linux学习—导航文件系统

    与windows相同,Linux操作系统也是以被称之为分层目录结构的方式来组织文件的.这意味着文件是以树形结构的目录中进行组织的,该树形结构目录可能包含文件和其他目录.文件系统的第一个目录叫做根目录, ...

  10. Python:模块学习——sys模块

    sys模块常见函数和变量 sys.argv:命令行参数,实现从程序外部向程序传递参数 [注]:(1) sys.argv[0] 表示代码本身的文件路径 (2)sys.argv是一个元组,可以用[ ]提取 ...