django之auth模块(用户认证)[Python基础]

python

django之auth模块(用户认证)

一、auth模块简介

  auth模块是django框架自带的功能模块,是对登录认证方法的一种封装,之前我们获取用户输入的用户名及密码后需要自己从user表里查询有没有用户名和密码符合的对象。而有了auth模块之后就可以很轻松的去验证用户的登录信息是否存在于auth_user表中(执行完迁移命令之后在数据库中自动生成的表)。除此之外,auth还对session做了一些封装,方便我们校验用户是否已登录。

二、相关的模块、对象、装饰器导入

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

from django.contrib.auth.models import User # 导入auth_user表对象

from django.contrib.auth.decorators import login_required # 校验用户是否登陆的装饰器

三、auth模块常用方法

1、创建用户

User.objects.create(username=username, password=password)  # 创建普通用户,密码不加密(不推荐使用)

User.objects.create_user(username=username, password=password) # 创建普通用户,密码加密(推荐使用)

User.objects.create_superuser(username=username, password=password, email="123@qq.com") # 创建超级用户,但是必须填写邮箱事项,要不报错

2、校验用户名和密码是否正确

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

# 用户名密码正确返回的是用户对象,错误返回None

3、保存用户登陆状态

auth.login(request, user_obj)

"""只要执行了此代码,之后在任意可以获取到request对象的地方,都可以通过request.user获取到当前登录的用户对象"""

4、如何判断当前用户是否登陆以及如何获取当前登陆用户对象

request.user.is_authenticated()  # 判断是否登陆

request.user # 登陆用户对象

5、校验用户是否登陆,未登录情况下自动跳转到自定义的登录界面

# 局部配置

from django.contrib.auth.decorators import login_required  # 导入校验用户是否登陆装饰器

# 局部配置@login_required(login_url="/login/") # 局部配置时,需要指定用户验证未登录时跳转到哪个页面def login_after01(request):

return HttpResponse("我是login_after01页面")

# 全局配置

  1)在settings.py中添加以下代码:

# 全局配置

LOGIN_URL = "/login/"

  2)views.py中这样写: 

from django.contrib.auth.decorators import login_required

@login_required # 全局配置时,只需要在配置文件中加入全局代码,这里不需要指定跳转页面

def login_after01(request):

return HttpResponse("我是login_after01页面")

PS:如果全局和局部都配置,则优先执行局部配置

6、检验密码、修改密码

# 先校验旧密码是否正确

request.user.check_password(old_password) # 返回的是布尔值

# 修改密码

request.user.set_password(new_password)

request.user.save() # 一定要保存

7、注销登陆

auth.logout(request)

四、根据auth常用方法写个栗子:使用auth模块写一个注册、登陆、修改密码、注销登陆功能

   此例使用全局配置,未登录自动跳转到 "/login" 界面

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

from django.contrib.auth.models import User # 导入auth_user表对象

from django.contrib.auth.decorators import login_required # 校验用户是否登陆的装饰器

# 注册功能

def reg(request):

if request.method == "POST":

username = request.POST.get("username")

password = request.POST.get("password")

# User.objects.create(username=username, password=password) # 创建普通用户,密码不加密(不推荐使用)

User.objects.create_user(username=username, password=password) # 创建普通用户,密码加密(推荐使用)

# User.objects.create_superuser(username=username, password=password, email="123@qq.com") # 创建超级用户,但是必须填写邮箱事项,要不报错

return HttpResponse("Congratulation!注册成功!")

return render(request, "reg.html")

# 登录功能

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)

# print(res) # 用户名密码正确返回的是用户对象,错误返回None

if user_obj:

# 保存用户登录状态

auth.login(request, user_obj)

"""只要执行了此代码,之后再任意可以获取到request对象的地方,

都可以通过request.user获取到当前登录的用户对象"""

return HttpResponse("登陆成功!")

return render(request, "login.html")

# 登陆之后可以查看的页面

@login_required

def get_user(request):

print(request.user)

"""用户登录成功之后,request.user拿到的就是用户对象,没有登录获取到的是匿名用户"""

print(request.user.is_authenticated)

return HttpResponse("get_user页面")

# 登陆之后可以查看的页面

@login_required

def login_after01(request):

return HttpResponse("我是login_after01页面")

# 登陆之后可以查看的页面

@login_required

def login_after02(request):

return HttpResponse("我是login_after02页面")

# 登陆之后可以查看的页面

@login_required

def login_after03(request):

return HttpResponse("我是login_after03页面")

# 修改密码功能

@login_required

def set_password(request):

if request.method == "POST":

old_password = request.POST.get("old_password")

new_password = request.POST.get("new_password")

# 先校验旧密码是否正确

is_right = request.user.check_password(old_password) # 返回的是布尔值

# 再修改密码

if is_right:

request.user.set_password(new_password)

request.user.save() # 一定要保存

return render(request, "set_password.html")

# 注销功能

@login_required

def logout(request):

auth.logout(request)

return HttpResponse("注销成功")

views.py

 五、auth_user表扩展字段(在auth_user表的基础上)

  方法:利用类的继承

  1)在models.py中定义表名和扩展字段

from django.contrib.auth.models import User, AbstractUser  # 导入类


# 定义类,类名即为表名,自定义的表将替换auth_user内置表

class UserInfo(AbstractUser):

# 扩展的字段,尽量不要与原先表中的字段冲突

phone = models.BigIntegerField()

age = models.IntegerField()

  2)在settings.py中添加以下代码:

AUTH_USER_MODEL = "app01.UserInfo"# 应用.表名

"""django就会将userinfo表来替换auth_user表,并且之前auth模块所有的功能不变,参照的也是userinfo表"""

扩展之前的表名和字段:

扩展之后的表名和字段:

以上是 django之auth模块(用户认证)[Python基础] 的全部内容, 来源链接: utcz.com/z/530397.html

回到顶部