用户认证
-
功能:记录用户登陆状态,必须使用django自带的auth_user表,后续需要添加字段,可以继承这一张表,也可以一对一绑定这张表
-
创建超级用户:python3 manage.py createsuperuser
auth模块
from django.contrib import auth
authenticate()
用户登陆认证,传入username与password,如果验证成功则返回的是user对象,失败则返回None,当试图登陆一个从数据库中直接取出来不经过authenticate()的User对象会报错的
user = authenticate(username='someone',password='somepassword')
login(HttpRequest,user)
该函数接受一个HttpRequest对象,以及一个通过认证了的User对象
函数使用django的session框架给某个已认证的用户附加上session id等信息。可使用request.user使用该对象,并且该对象是全局变量,在模板中可以直接使用
如果没有认证通过则调用request.user是一个匿名用户
def login(request):
if request.method == 'POST':
user = request.POST.get('user')
pwd = request.POST.get('pwd')
# 用户认证接口,如果验证成功,则user对象,失败则返回None
user = auth.authenticate(username=user,password=pwd)
if user:
auth.login(request,user) # request.user = user
# request.user永远是当前登陆对象
return redirect("/index/")
return render(request,'login.html')
def index(request):
# 假如说没有登陆的话打印的是匿名用户
# 登陆了打印的是当前登陆的用户信息
print(request.user)
print(request.user.id)
print(request.user.is_anonymous) # 打印当前是否是匿名用户
return render(request,'index.html')
logout(request)
注销函数,该函数接收一个HttpRequest参数,使用该参数会清空session以及session数据库中的数据
def logout(request):
auth.logout(request)
return redirect('/login/')
基于用户认证组件的注册功能
User 对象属性:username, password(必填项)password用哈希算法保存到数据库
from django.contrib.auth.models import User
- User对象的is_authenticated
如果是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经通过了认证。
- 注册
from django.contrib.auth.models import User
user = User.objects.create_user(username='',password='',email='')
def reg(request):
if request.method == 'POST':
user = request.POST.get('user')
pwd = request.POST.get('pwd')
# 注册普通用户
user = User.objects.create_user(username=user,password=pwd)
# 注册超级用户
# user = User.objects.create_superuser(username=user,password=pwd)
return redirect('/login/')
return render(request,'reg.html')
- check_password(password)
用户需要修改密码的时候 首先要让他输入原来的密码 ,如果给定的字符串通过了密码检查,返回 True
- 修改密码
使用 set_password() 来修改密码
user = User.objects.get(username='')
user.set_password(password='')
user.save
基于用户认证组件的认证装饰器
要求:
- 用户登陆后才能访问某些页面,
- 如果用户没有登录就访问该页面的话直接跳到登录页面
- 用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址
可以直接使用django设计好装饰器:login_required()
若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' (这个值可以在settings文件中通过LOGIN_URL进行修改)。并传递 当前访问url的绝对路径 (登陆成功后,会重定向到该路径)
from django.contrib.auth.decorators import login_required
假设登陆后才可以访问order(不是在登陆成功后写死)
def login(request):
if request.method == 'POST':
user = request.POST.get('user')
pwd = request.POST.get('pwd')
user = auth.authenticate(username=user,password=pwd)
if user:
auth.login(request,user) # request.user = user
# 使用装饰器动态获取登陆后跳转的页面,如果没有获取到next值则默认跳转到index
red_url = request.GET.get('next','/index/')
return redirect(red_url)
return render(request,'login.html')
@login_required
def order(request):
return render(request,'order.html')