目录
二、 Auth组件的常用方法 - from django.contrib import auth
- create_user(username,password) -- 创建普通用户
- create_superuser(username,password,email) -- 创建超级用户
- authenticate(username,password) -- 用户验证,返回User对象
- login(HttpRequest, user) -- 用户登陆,写入session
- logout(request) -- 清除当前请求的session信息,无返回值
- is_authenticated() -- request.user内方法,判断当前请求是否通过验证,返回布尔值
- @login_requierd(redirect_field_name,login_url) -- 登陆验证装饰器
- check_password(password) -- request.user内方法,检查密码是否正确,返回布尔值
- set_password(password) -- request.user内方法,修改密码,参数为新密码
- is_staff -- 是否拥有网站的管理权限(登陆内置admin组件的权限)
一、Auth组件 - Django自带的用户认证模块
我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情呢。
Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用户数据。
二、 Auth组件的常用方法 - from django.contrib import auth
注意:
- request.user 产生原因:发送请求后,在中间件内,通过cookie查询user信息,若存在放到request.user内,若不存在放入匿名用户
- request内的属性和方法可以在模板内直接使用
2-1 注册相关方法
注意:
- 创建用户必须使用Auth内方法,手动写入表内的密码字段是明文形式
- 注意导入Auth内部自设表对象,以及防止重名
from django.contrib.auth.models import User
- 可以在终端下创建超级用户 -- python3 manage.py createsuperuser
- create_user(username,password) -- 创建普通用户
from django.contrib.auth.models import User user = User.objects.create_user(username='test', password=123)
- create_superuser(username,password,email) -- 创建超级用户
注意一:必须填入email字段,否则报错如下
注意二:用户名不可重名,否则报错如下
from django.contrib.auth.models import User user = User.objects.create_superuser(username='test1', password=123,email='123@123.com')
2-2 登陆相关方法
- authenticate(username,password) -- 用户验证,返回User对象
from django.contrib import auth user = auth.authenticate(username='test', password=123) print(type(user)) # <class 'django.contrib.auth.models.User'> # 同上,对数据库的查询操作 user = models.User.objects.filter(name='test',pwd='123').first()
- login(HttpRequest, user) -- 用户登陆,写入session
''' auth.login(request, user) 接受一个HttpRequest对象,以及一个经过认证的User对象。 登陆成功后: - 以后再视图类,函数中的request对象中,就有一个user对象,就是当前登录的用户对象 - 如果没有登录,request.user=AnonymousUser,匿名用户 ''' from django.contrib import auth def login(request): if request.method == 'GET': return render(request, 'login.html') elif request.method == 'POST': name = request.POST.get('name') pwd = request.POST.get('pwd') # 校验,获取对象 user = auth.authenticate(request, username=name, password=pwd) if user: # 登录,其实就是把用户信息放到session auth.login(request, user) # 同上 # request.sessiono['name']=name return HttpResponse('登录成功') else: return HttpResponse('用户名或密码错误')
- logout(request) -- 清除当前请求的session信息,无返回值
from django.contrib import auth def logout(request): auth.logout(request) # 内部:调用了request.session.flush(),删除了登录状态 return redirect('/login/')
- is_authenticated() -- request.user内方法,判断当前请求是否通过验证,返回布尔值
''' 可以将 is_authenticated()放在模板中使用,判断是否登陆 {{ request.user.is_authenticated }} 页面上显示>>> CallableBool(False) ''' from django.shortcuts import render, HttpResponse, redirect def check_login(request): print(request.user.is_authenticated()) # True if not request.user.is_authenticated(): return HttpResponse('error!please login!') return HttpResponse('ok')
- @login_requierd(redirect_field_name,login_url) -- 登陆验证装饰器
''' @login_required(redirect_field_name='eee',login_url='/login/') - redirect_field_name:修改?后面的key值,一般不进行设置 - login_url:如果没有登录,跳转到的页面 - 可以局部配置 - 可以全局配置(在setting中) LOGIN_URL='/login/' @login_required(redirect_field_name='aaa',login_url='/login/') --- http://127.0.0.1:8000/login/?aaa=/test/ ''' from django.contrib.auth.decorators import login_required @login_required def test(request): # from django.core.handlers.wsgi import WSGIRequest print(type(request)) user = request.user.password print(user) return render(request, 'test.html')
2-3 修改密码相关
注意一:只能在登陆之后进行查询、修改操作,否则报错如下:
- check_password(password) -- request.user内方法,检查密码是否正确,返回布尔值
''' auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。 密码正确返回True,否则返回False。 ''' def check_pwd(request): # 将获取的pwd与当前登陆成功的密码进行比对操作 pwd = '1233' ret = request.user.check_password(pwd) print(ret) return HttpResponse('ok')
- set_password(password) -- request.user内方法,修改密码,参数为新密码
''' auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。 注意:设置完一定要调用用户对象的save方法!!! ''' @login_required(login_url='/login/') def change_pwd(request): pwd = '1111' user = request.user user.set_password(pwd) user.save() return HttpResponse('ok')
2-4 查看用户权限相关
- is_staff -- 是否拥有网站的管理权限(登陆内置admin组件的权限)
- is_active -- 是否允许登陆(布尔值)
三、扩展Auth自动产生的auth_user表(两种方式)
方式一、新建表模型,与auth_user表建立一对一关系
from django.db import models from django.contrib.auth.models import User class UserDetail(models.Model): phone = models.CharField(max_length=32) # 一对一跟auth_user表做关联 # 不加引号:外部映入的表模型 # 加引号:models存在的表模型 user = models.OneToOneField(to=User)
方式二、新建表模型,继承AbstractUser
''' 必须在setting内全局配置 : AUTH_USER_MODEL ='app01.UserInfo' 数据迁移后,不存在内置的auth_user表,认证组件都使用跟新的UserInfo表 注意:之后各类Auth方法使用的User表模型导入,都换成app01.UserInfo的导入 ''' from django.db import models from django.contrib.auth.models import User, AbstractUser class UserInfo(AbstractUser): # 新增、修改字段 phone=models.CharField(max_length=32) sex=models.BooleanField()