实现登录
函数体:
#使用权限系统实现登录
from django.contrib.auth import authenticate,login,logout
def login_view(request):
# user = request.user
#判断是否登录
if request.user.is_authenticated: #表示是否是合法的,匿名用户返回False
return redirect('student:student_list')
if request.method == 'POST':
#获取用户名和密码
username = request.POST.get('username')
password = request.POST.get('password')
#校验用户名以及密码
user = authenticate(username = username,password = password) #正确返回user对象,错误返回None
if user is not None:
#用户信息存放在session,并登录
login(request,user)
return redirect('student:student_list')
return render(request, 'students/login.html')
==================================================
"""记得配置路径"""
模板页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>欢迎{{ user.username|default:'游客' }}访问</h1>
{% if user.is_authenticated %}
<a href="{% url 'student:logout' %}">退出</a>
{% else %}
<a href="{% url 'student:login' %}">登录</a>
{% endif %}
</body>
</html>
实现退出
函数体:
from django.contrib.auth import authenticate,login,logout
#使用权限系统实现退出
def logout_view(request):
logout(request)
return redirect('student:index')
模板页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>欢迎{{ user.username|default:'游客' }}访问</h1>
{% if user.is_authenticated %}
<a href="{% url 'student:logout' %}">退出</a>
{% else %}
<a href="{% url 'student:login' %}">登录</a>
{% endif %}
</body>
</html>
实现限制
函数体(限制登录是限制游客用户登录信息列表,所以在详情页做限制,下面代码只看限制登录部分代码)
from django.contrib.auth import authenticate,login,logout
#查询功能(信息详情页)
def student_list(request):
#限制登录
if not request.user.is_authenticated: #如果是未登录用户访问,则返回登录界面
return redirect('student:login')
section = "球员列表"
# 查询功能
search = request.GET.get("search","").strip()
if search:
if search.isdigit():
sts = Student.objects.filter(Q(QQ=search) | Q(phone=search),is_delete=False)
else:
sts = Student.objects.filter(name=search,is_delete=False)
else:
sts = Student.objects.filter(is_delete=False) # 从模型中拿到所有学生
sts = sts.order_by("-c_time") #排序 后创建的放在第一位
#分页
#数据总量
total_num = sts.count()
#每页的数据条数
per_page = request.GET.get('per_page',10) #10为默认值,每页数据条数
#当前页码
page = request.GET.get('page',1)
paginator = Paginator(sts,per_page)#每页显示的人数
sts = paginator.get_page(page) #显示是哪一页
total_page = paginator.num_pages #总页面
return render(request,'students/student_list.html',context={
"students" : sts,
"section" : section,
"search" : search,
"per_page" : per_page,
"total_page" : total_page,
"page" : page,
})
限制优化
实际开发中,如果我们想要访问某个页面,而这个页面需要登录权限,我们登录后自动跳转回此前我们想要访问的页面;
登录优化一:
处理方法:把当前的路径当做参数传进去;
#详情页,只看自动解析部分reverse
from django.contrib.auth import authenticate,login,logout
from django.urls import reverse
#查询功能(信息详情页)
def student_list(request):
#限制登录
if not request.user.is_authenticated: #如果是未登录用户访问,则返回登录界面
return redirect(reverse('student:login') + '?next={}'.format(request.path_info)) #reverse 自动解析,用于路径的拼接 students/login/?next='students/student_list
section = "球员列表"
# 查询功能
search = request.GET.get("search","").strip()
if search:
if search.isdigit():
sts = Student.objects.filter(Q(QQ=search) | Q(phone=search),is_delete=False)
else:
sts = Student.objects.filter(name=search,is_delete=False)
else:
sts = Student.objects.filter(is_delete=False) # 从模型中拿到所有学生
sts = sts.order_by("-c_time") #排序 后创建的放在第一位
#分页
#数据总量
total_num = sts.count()
#每页的数据条数
per_page = request.GET.get('per_page',10) #10为默认值,每页数据条数
#当前页码
page = request.GET.get('page',1)
paginator = Paginator(sts,per_page)#每页显示的人数
sts = paginator.get_page(page) #显示是哪一页
total_page = paginator.num_pages #总页面
return render(request,'students/student_list.html',context={
"students" : sts,
"section" : section,
"search" : search,
"per_page" : per_page,
"total_page" : total_page,
"page" : page,
})
from django.contrib.auth import authenticate,login,logout
from django.urls import reverse
"""
添加next_url路径,并加以判断
具体请看登录优化一的所有部分
"""
#使用权限系统实现登录
def login_view(request):
# user = request.user
#登录优化一
next_url = request.GET.get('next')
#判断是否登录
if request.user.is_authenticated: #表示是否是合法的,匿名用户返回False
if next_url:
return redirect(next_url)
if request.method == 'POST':
#获取用户名和密码
username = request.POST.get('username')
password = request.POST.get('password')
#校验用户名以及密码
user = authenticate(username = username,password = password) #正确返回user对象,错误返回None
if user is not None:
#用户信息存放在session,并登录
login(request,user)
#登录优化一
if next_url:
return redirect(next_url)
return render(request, 'students/login.html')
登录优化二
多个视图函数,同时都需要添加这个功能,需要在每个视图上都加上相同的代码,就会出现代码冗余
解决方案:装饰器
from django.contrib.auth.decorators import login_required
"""使用@login_required装饰器代替限制登录中的代码就OK,在每个视图上都加上就可以同时有限制登录作用"""
#查询功能(信息详情页)
@login_required
def student_list(request):
# #限制登录
# if not request.user.is_authenticated: #如果是未登录用户访问,则返回登录界面
# return redirect(reverse('student:login') + '?next={}'.format(request.path_info)) #reverse 自动解析,用于路径的拼接 students/login/?next='students/student_list
section = "球员列表"
# 查询功能
search = request.GET.get("search","").strip()
if search:
if search.isdigit():
sts = Student.objects.filter(Q(QQ=search) | Q(phone=search),is_delete=False)
else:
sts = Student.objects.filter(name=search,is_delete=False)
else:
sts = Student.objects.filter(is_delete=False) # 从模型中拿到所有学生
sts = sts.order_by("-c_time") #排序 后创建的放在第一位
#分页
#数据总量
total_num = sts.count()
#每页的数据条数
per_page = request.GET.get('per_page',10) #10为默认值,每页数据条数
#当前页码
page = request.GET.get('page',1)
paginator = Paginator(sts,per_page)#每页显示的人数
sts = paginator.get_page(page) #显示是哪一页
total_page = paginator.num_pages #总页面
return render(request,'students/student_list.html',context={
"students" : sts,
"section" : section,
"search" : search,
"per_page" : per_page,
"total_page" : total_page,
"page" : page,
})










网友评论