个人网站: lipeiguan.top

以后会慢慢转移到个人网站, 欢迎大家收藏^ . ^

写在前面

我们在开发一个网站的时候, 经常需要实现网站的用户系统. 这个时候我们需要实现用户注册、用户登录、用户认证、注销、修改密码等一系列功能. 如果我们都是自己实现的话, 不是不可以, 只是有些浪费时间.

而Django则内置了一个用户认证系统 --> auth, 它默认使用 auth_user表来储存用户的数据.

那么接下来就来了解一下这个强大的用户认证系统.

auth模块

导入auth

要使用这个模块, 就需要先导入它.

from django.contrib import auth

auth模块中的各种方法

authenticate()

  • 验证用户名以及密码是否正确

该函数提供了用户认证功能, 一般需要username、password两个关键字参数.

如果用户名和密码正确, 则会返回一个User对象, authenticate()会在该User对象上设置一个属性来标识后端已经认证了该用户, 而且该信息在后续的登录过程中是需要的.

具体用法:

user = auth.authenticate(request, username="username", password="password")

login(HttpRequest, user)

  • 登录

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

主要实现了一个用户登录的功能, 它会在后端为该用户生成相关的session数据.

具体用法:

from django.shortcuts import render, redirect
from django.contrib import auth def my_login(request):
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
user = auth.authenticate(request, username=username, password=password)
if user:
auth.login(request, user)
# Redirect to a success page.
else:
# Return an "invalid login" error message.
return render(request, "login.html")

logout(request)

  • 注销用户

该函数接受一个HttpRequest对象, 无返回值.

当调用该函数时, 当前请求的session信息会全部清除. 该用户即使没有登录, 使用该函数也不会报错.

具体用法:

from django.authenticate import auth

def logout(request):
auth.logout(request)
# Redirect to a success page.
return redirect('/login/')

is_authenticated()

  • 判断当前请求是否通过了认证

如果一个页面需要登录才能访问, 一个用户在没有登录的情况下就访问该页面的话就会直接跳转到登录页面, 之后在完成登录之后, 会自动访问跳转之前的页面.

具体用法:

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

Django也为我们设计好了一个用于该情况的装饰器. 见 login_required()

login_required()

  • 登录校验

auth给我们提供了一个装饰器工具, 用来快捷的给某个视图添加登录校验.

具体用法:

from django.contrib.auth.decorators import login_required

@login_required
def index(request):
...

若用户没有登录, 则会跳转到Django默认的登录URL: 'accounts/login', 并传递当前访问URL的绝对路径(登录成功后, 会重定向到该路径).

当然, 我们可以自定义登录的URL, 在settings.py文件中添加如下代码

LOGIN_URL = '/login/'

create_user()

  • 创建新用户

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

具体用法:

from django.contrib.auth.models import User

user = User.objects.create_user(username="用户名", password="密码", email="邮箱(可以为空)", ...)

create_superuser()

  • 创建超级用户

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

具体用法:

from django.contrib.auth.models import User

user = User.objects.create_superuser(username="用户名", password="密码", email="邮箱", ...)

check_password(password)

  • 检查密码是否正确

auth提供一个检查密码是否正确的方法, 需要提供当前请求用户的密码.

比如当用户需要修改密码时, 要输入原来的密码, 如果输入的字符串通过了密码检查, 则返回 True, 否则返回 False.

具体用法:

ok = request.user.check_password("密码")

set_password(password)

  • 修改密码

auth提供的一个修改密码的方法, 接收 要设置的新密码 作为参数.

注意: 设置完一定要调用用户对象的save方法!!!

具体用法:

request.user.set_password("密码")
request.user.save()

登录、修改密码、注册、注销功能示例

登录:

def login(request):
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
user_obj = auth.authenticate(request, username=username, password=password)
if user_obj:
# 记录登录状态
auth.login(request, user_obj)
next = request.GET.get("next")
if next:
return redirect(next)
return redirect('/index/')
return render(request, "login.html")

修改密码:

@login_required
def set_password(request):
user = request.user
error_message = ""
if request.method == "POST":
old_password = request.POST.get("old_password") # 旧密码
new_password = request.POST.get("new_password") # 新密码
repeat_password = request.POST.get("repeat_password") # 重复密码
if user.check_password(old_password):
if not new_password:
error_message = "新密码不能为空"
elif new_password != repeat_password:
error_message = "两次密码不一致"
else:
user.set_password(new_password)
user.save()
return redirect('/login/')
else:
error_message = "原密码输入有误"
return render(request, "set_password.html", {"error_message": erroe_message})
return render(request, "set_password.html")

注册:

def reg(request):
error_message = ""
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
repeat_password = request.POST.get("repeat_password")
if password:
if password != repeat_password:
error_message = "密码输入不一致"
else:
User.objects.create_user(username=username, password=password)
return redirect('/login/')
else:
error_message = "密码不能为空"
return render(request, "reg.html")

注销:

def logout(request):
auth.logout(request)
return redirect('/login/')

User对象的属性

  • id
  • username: 用户名
  • password: 密码
  • email: 邮箱
  • is_staff: 用户是否拥有网站的管理权限
  • is_active: 是否允许用户登录. 设置为False, 可以在不删除用户的前提下禁止用户登录
  • is_superuser: 是否是超级用户
  • last_login: 最后登录时间
  • first_name: 名
  • last_name: 姓
  • date_joined

扩展默认的auth_user表

Django内置的认证系统很好用,但是提供的auth_user表的字段只有那么几个, 如果需要增加几个字段该怎么办呢?

比如说想增加一个存储用户手机号的字段, 就可以通过继承内置的AbstractUser类, 来定义一个自己的Model类.

这样既可以根据项目需求设计用户表, 也可以使用Django的认证系统.

具体方法:

from django.contrib.auth.models import AbstractUser

class UserInfo(AbstractUser):
nid = models.AutoField(primary_key=True)
phone = models.CharField(max_length=11, null=True, unique=True) def __str__(self):
return self.username

注意:

只是按照上面的方式扩展了内置的auth_user表之后还不够, 还需要在settings.py文件中告诉Django, 我现在使用我定义的UserInfo表来做用户认证.

在settings.py中添加如下代码:

# 引用Django自带的User表, 继承时需要设置
AUTH_USER_MODEL = "app名.UserInfo"

注意:

一旦我们指定了新的认证系统所使用的表, 就需要重新在数据库中创建表, 而不能继续使用原来默认的auth_user表了.

『Django』第N+1节: Django自带的认证系统 - auth的更多相关文章

  1. Django之自带的认证系统 auth模块

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

  2. Django认证系统auth认证

    使用Django认证系统auth认证 auth认证系统可以处理范围非常广泛的任务,且具有一套细致的密码和权限实现.对于需要与默认配置不同需求的项目,Django支持扩展和自定义认证;会将用户信息写入到 ...

  3. Django的认证系统—auth模块

    Django的认证系统 auth模块的知识点总结: 1. 创建超级用户 python manage.py createsuperuser from django.contrib import auth ...

  4. Django的认证系统 auth模块

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

  5. Django自带的认证系统

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

  6. Django的自带认证系统——auth模块

    Django自带的用户认证 auth模块 from django.contrib import auth 备注:使用auth模块时,我们默认使用Django提供的auth_user表,创建数据时,可以 ...

  7. 15.Django基础十一之认证系统

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

  8. day 65 Django基础十一之认证系统

    Django基础十一之认证系统   本节目录 一 auth模块 二 User对象 三 扩展默认的auth_user表 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 auth模块 我们 ...

  9. D django 用户认证系统

    django认证系统包含三个部分:用户.权限和分组 安装 django项目默认启用了认证系统,如果不是使用django-admin.py创建项目的可以通过在settings配置文件里面的INSTALL ...

随机推荐

  1. 深入理解JVM——关于垃圾回收

    关于垃圾回收 仿佛来自上海居委会大妈的灵魂拷问:“你是什么垃圾?” 不 今天我们要说的是JVM的垃圾回收 假如我是一个“人”类的“对象”,也和人的生命一样必有一死,可是“我真的还想再活500年~~”, ...

  2. RK3399 删除开机锁屏界面

    CPU:RK3399 系统:Android 7.1 删除开机锁屏界面 diff --git a/frameworks/base/packages/SettingsProvider/res/values ...

  3. HearthBuddy 调试肯瑞托法师寒冰屏障的配合

    35疯狂的科学家 63肯瑞托法师 13过期货物专卖商 64对面的英雄术士 比较好的出牌策略是,肯瑞托法师+寒冰屏障 ailoop1 startEnemyTurnSimThread1start prin ...

  4. DBeaver的时区问题

    最近使用DBeaver作为连接MySQL的客户端,发现执行sql返回的datetime类型字段时间不对,比实际时间多了10多个小时, 无论是连接开发服务器或者连本机MySQL都有这个问题. 检查服务器 ...

  5. 【转】nodejs接收前端formData数据

    很多时候需要利用formdata数据格式进行前后端交互. 前端代码可以是如下所示: <!DOCTYPE html> <html lang="en"> < ...

  6. 34 Flutter仿京东商城项目 用户注册 注册流程 POST发送验证码 倒计时功能 验证验证码

    加群452892873 下载对应34课文件,运行方法,建好项目,直接替换lib目录 以下列出的是本课涉及的文件. RegisterFirst.dart import 'package:flutter/ ...

  7. 算法习题---4.3救济金发放(UVa133)

    一:题目 (n< )个人站成一圈,逆时针编号为1~n.有两个官员,A从1开始逆时针数,B从n开始顺时针数.在每一轮中,官员A数k个就停下来,官员B数m个就停下来(注意有可能两个官员停在同一个人上 ...

  8. CentOS7下搭建zabbix监控(三)——Zabbix监控服务配置

    CentOS7下搭建zabbix监控(一)——Zabbix监控端配置 CentOS7下搭建zabbix监控(二)——Zabbix被监控端配置 (1).配置Zabbix监控Apache服务 主机名:yo ...

  9. linuxan安装redis出现Newer version of jemalloc required错误

    linux安装redis执行make命令时出现问题 解决方法 make MALLOC=libc 如果要指定安装文件夹 使用命令:make PREFIX  = /usr/local/redis(文件夹路 ...

  10. C# http请求 设置代理(标题可以作为搜索关键字)

    例一(C# 通过代理发HTTP请求): https://q.cnblogs.com/q/88682/ 例二(C# 代理HTTP请求): https://www.cnblogs.com/ShalenCh ...