毛毛Django修炼之路——auth模块

版权声明:全是自学! https://blog.csdn.net/qq_42874244/article/details/84754426

auth 模块——Django自带的用户认证模块

auth 模块

模块的导入

from django.contrib import auth

auth 模块自带的用户认证模块
auth模块自带了一个认证模块,即验证用户名以及密码是否正确!如下:

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

返回的是布尔值!

login(HTTPRequest,user)
该函数接受一个httpreuqest函数,以及一个经过认证的user对象。
本质上后端为该用户生成相关的session数据。
可以通过

user_obj = auth.login

得到一个login对象,这个对象就可以通过“.username”等方法得到相关user的信息!

from django.contrib.auth import authenticate, login

def my_view(request):
	username = request.POST.get("username")
	password = request.POST.get("password")
	user_obj = authenticate(username = "username", password="password")
	if user:
		login(request, user_obj)
		# 登录成功,返回需要的文件或者网页
	else:
		# 登录校验失败,返回login

注意:只要使用login(reuqest, user_obj)之后,reuqest.user就能拿到当前登录的用户对象。否则request.user得到的是一个匿名用户对象(AnonymousUser Object)。
logout(request)——注销
该函数接受一个HttpRequest对象,无返回值!

from django.contrib.auth import logout

def logout_view(request):
	logout(reuqest)

is_authenticated()——判断当前请求是否通过了认证

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

login_reuqest()——装饰器实现登录校验

from django.contrib.auth.decorators import login_required

@login_required
# 装饰器校验登录事件
def my_view(request):
	...

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

如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。

如下:

LOGIN_URL = '/login/' # 这里配置成你项目登录页面的路由

create_user()——提供一个创建普通用户的方法
这里提供必要的参数(request、password)

from django.contrib.auth.models import User
user_obj = User.object.create_user(username='用户名',password='密码',enail='邮箱',...)

create_superuser()——创建一个超级用户

from django.contrib.auth.models import User
user_obj = User.object.create_superuser(username='用户名',password='密码',enail='邮箱',...)

check_password(raw_password)——校验密码是否正确
auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。
返回布尔值
用法:

OK = user_obj.check_password('密码')

或者直接针对当前请求的user对象校验原始密码是否正确(大多用于用户修改密码的时候校验秘密!)

ok = reuqest.user.check_password(raw_password='原始密码')

set_password(raw_password)——修改密码
接受要修改的密码座位参数
注意:设置完对象一定要保存save()

user_obj.set_password('新密码')
user_obj.save()

一个修改密码的完整实例

@login_required
def set_password(request):
    user = request.user
    err_msg = ''
    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:
                err_msg = '新密码不能为空'
            elif new_password != repeat_password:
                err_msg = '两次密码不一致'
            else:
                user.set_password(new_password)
                user.save()
                return redirect("/login/")
        else:
            err_msg = '原密码输入错误'
    content = {
        'err_msg': err_msg,
    }
    return render(request, 'set_password.html', content)

修改密码示例

用户对象的属性auth
user_obj 能够拿到认证所有用户表的数据属性,比如username,password等。
这个对象还具有一些其他的属性:(如下)
is_staff:用户是否拥有网站的管理权限
is_active:是否允许用户登录,设置为false,可以在不删除该用户的情况下禁止该用户登录!

扩展默认的auth_user表

我们能看到这么好用的Django自带的user表里面的字段是不完全满足我们的需求的,所以我们可以通过类的继承的方法来扩展Django里面user表字段!
继承内置的 “AbstractUser”类,来自定义一个Model类。方法如下:

from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
# 此时就继承了原来的user表里面的所有方法和信息,只是以后再调用的时候就需要命名userinfo了!
	"""
	需要新增的用户信息表
	"""
	
	def __str__(self):
		return self.username

注意:——按照上面的方法扩展了auth_user表之后,一定要在settings.py中告诉Django现在使用我新定义的userinfo表来做用户认证。如下

AUTH_USER_MODEL="app01.UserInfo"

此时创建新用户:

UserInfo.object.creat_user(username = "username", password = "password")

创建超级用户:

UserInfo.object.creat_superuser(username = "username", password = "password")

人生苦短,我学python!
再次注意:一旦我们指定了新的认证系统所使用的表,我们就需要重新在数据库中创建该表,而不能继续使用原来默认的auth_user表了。

猜你喜欢

转载自blog.csdn.net/qq_42874244/article/details/84754426
今日推荐