from django.contrib import auth
from django.contrib.auth.models import User (User表)
一:auth模块
1:auth相关表-用户认证的前提
Django 在认证组件里自带一个关于auth的表auth_user。
使用命令插入数据(交互式):python manage.py createsuperuser
2:用法
1 、authenticate() :验证用户输入的用户名和密码是否相同
提供了用户认证,即验证用户名以及密码是否正确,一般需要username password两个关键字参数
如果认证信息有效,会返回一个 User 对象。authenticate()会在User 对象上设置一个属性标识那种认证后端认证了该用户,且该信息在后面的登录过程中是需要的。当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象会报错的!!
user = authenticate(username='someone',password='somepassword')
2 、login(HttpRequest, user):登录
该函数接受一个HttpRequest对象,以及一个认证了的User对象
此函数使用django的session框架给某个已认证的用户附加上session id等信息。
3 、logout(request) 注销用户
该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。
# 1:request.COOKIE.get("sessionid) #取cookie中的值 # 2:在Django - session表过滤session - key的记录并与删除这条记录 # 3:删除cookie,response.delete_cookie("sessionid") session: request.session.flush() #相当于上面3个步骤 ''' auth模块: auth.logout(request) #相当于上面的那个步骤
4 、user对象
4.1 is_authenticated()
如果是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经通过了认证。
通过认证并不意味着用户拥有任何权限,甚至也不检查该用户是否处于激活状态,这只是表明用户成功的通过了认证。 这个方法很重要, 在后台用request.user.is_authenticated()判断用户是否已经登录,如果true则可以向前台展示request.user.name
要求:
1 用户登陆后才能访问某些页面,
2 如果用户没有登录就访问该页面的话直接跳到登录页面
3 用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址
方法1:
def my_view(request): if not request.user.is_authenticated(): return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
方法2:
django已经为我们设计好了一个用于此种情况的装饰器:login_requierd()
from django.contrib.auth.decorators import login_required @login_required def my_view(request): ...
若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' (这个值可以在settings文件中通过LOGIN_URL进行修改)。并传递 当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。
4.2 、创建用户:create_user
(我们之前插入用户对象是通过命令行,但在代码中我们怎么插入呢)
from django.contrib.auth.models import User user = User.objects.create_user(username='',password='',email='')
4.3 、check_password(passwd):密码检查
用户需要修改密码的时候 首先要让他输入原来的密码 ,如果给定的字符串通过了密码检查,返回
True
4.4 、修改密码: set_password()
user = User.objects.get(username='')#拿到用户对象 user.set_password(password='') user.save
二:案例:
前提:python manage.py createsuperuser 往auth_user里添加些数据
1:登陆认证
在项目--图书管理系统--第五阶段--加入cookie和session功能 基础上
url.py
path('log/', views.log,name='log'), #auth登陆
path('index_user/', views.index_user,name='index_user'),#auth
views.py
from django.contrib import auth def log(request): if request.method == 'GET': return render(request, 'login.html') else: # 获取用户名和密码 user = request.POST.get('user') pwd = request.POST.get('pwd') # 数据库查询用户是否存在 # authenticate去auth_user查寻记录,查询成功返回用户对象,失败返回None user_obj=auth.authenticate(username=user,password=pwd) if user_obj: # 保存用户状态信息session,保存好后request.user(全局变量)就是当前登陆对象 auth.login(request,user_obj) #记录user_obj的相关信息;request.session["user"]=user_obj.pk===>request.user:当前登陆用户对象,默认是anonymousUser ''' print(request.user)#当前用户默认匿名用户anonymousUser print(request.user.id) print(request.user.username) #True是否是活动用户 '''else: return redirect(reverse('login'))
def index_user(request):
if request.user.id :#或者使用request.user.is_authenticated ===> True/False
#进入到图书管理界面,分页
book_list = Book.objects.all()
paginator = Paginator(book_list, 5)
try: #如果取超过页码的页面会报错
current_page_num=request.GET.get('page',1) #如果取不到数据,就取第一页的#取值page是多少
current_page=paginator.page(current_page_num)#显示第几页数据
except EmptyPage as e:
current_page_num=1
current_page = paginator.page(1)
return render(request, 'index.html', {'current_page': current_page,'paginator':paginator,'current_page_num':int(current_page_num)})
else:
return redirect(reverse('login'))
def logout(request):
'''
# 1:request.COOKIE.get("sessionid) #取cookie中的值
# 2:在Django - session表过滤session - key的记录并与删除这条记录
# 3:删除cookie,response.delete_cookie("sessionid")
request.session.flush() #相当于上面3个步骤
'''
auth.logout(request) #相当于上面的那个步骤
return redirect(reverse('log'))
2:注册
(1)前端页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>图书管理系统登陆</title> </head> <style> *{ padding: 0; margin: 0; } .aa{ margin: 0 auto; margin-top: 100px; height: 120px; width: 200px; background-color: #4cae4c; } input{ display: block; } .right{ float: right; } .left{ float: left; } </style> <body> <div class="aa"> <form action="" method="post"> {% csrf_token %} 用户名<input type="text" name="user"> 密 码<input type="text" name="pwd"> <input class="right" type="submit" value="注册"> </form> </div> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>图书管理系统登陆</title> </head> <style> *{ padding: 0; margin: 0; } .aa{ margin: 0 auto; margin-top: 100px; height: 120px; width: 200px; background-color: #4cae4c; } input{ display: block; } .right{ float: right; } .left{ float: left; } </style> <body> <div class="aa"> <form action="" method="post"> {% csrf_token %} 用户名<input type="text" name="user"> 密 码<input type="text" name="pwd"> <input class="right" type="submit" value="注册"> </form> </div> </body> </html>
(2)后端
urls.py
path('reg/', views.reg,name='reg'), #auth注册
views.py
def reg(request): if request.method=='GET': return render(request,'reg.html') else: user=request.POST.get('user') pwd=request.POST.get('pwd') from django.contrib.auth.models import User # User.objects.create_superuser() #创建超级用户 User.objects.create_user(username=user,password=pwd) #创建普通用户 return redirect(reverse('log'))
3:修改密码
(1)前端页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>图书管理系统</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <style> * { margin: 0; padding: 0; } .header { width: 100%; height: 50px; background-color: #369; } .logout{ display:block; float: right; margin-right: 50px; margin-top: 15px; } .h{ margin-left: 46%; margin-top: 10px; float: left; font-size: 20px; color: yellow; } </style> </head> <body> <div class="header"> <div> <p class="h">图书管理系统</p> <form action="/logout/"> <input class="logout"name="logout" type="submit"value="注销"> </form> <form action="/set_password/"method="get"> <input class="logout"name="logout" type="submit"value="修改密码"> </form> </div> </div> <div class="container"> <div class="row"> <div class="col-md-2 "> <div class="panel panel-default"> <div class="panel-heading"><div class="btn ">功能系统</div></div> <div class="panel-body"> <div class="btn "><a href="{% url 'books' %}">图书管理系统</a></div> <div class="btn"><a href="#">作者管理系统</a></div> <div class="btn"><a href="#">出版社管理系统</a></div> </div> </div> </div> <div class="col-md-10" style="padding-top: 20px"> {% block content %} {% endblock %} </div> </div> </div> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>图书管理系统登陆</title> </head> <style> *{ padding: 0; margin: 0; } .aa{ margin: 0 auto; margin-top: 100px; height: 120px; width: 200px; background-color: #4cae4c; } input{ display: block; } .right{ float: right; } .left{ float: left; } </style> <body> <div class="aa"> <form action="" method="post"> {% csrf_token %} 用户名<input type="text" name="user"placeholder="{{ reqest.user.username }}"> 密 码<input type="text" name="pwd"> <input class="right" type="submit" value="修改密码"> </form> </div> </body> </html>
(2)后端
urls.py
path('set_password/', views.set_password,name='set_password'), #auth修改密码
views.py
def set_password(request): if request.method=='GET': return render(request,'set_password.html') else: # user=request.POST.get('user') pwd=request.POST.get('pwd') user = User.objects.get(username=request.user.username) user.set_password(raw_password=pwd) user.save() return redirect(reverse('log'))