美文网首页
Django权限系统实现网站的登录与退出功能

Django权限系统实现网站的登录与退出功能

作者: 生命有一种执着 | 来源:发表于2020-07-14 11:21 被阅读0次

实现登录

函数体:

#使用权限系统实现登录
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,
    })

相关文章

网友评论

      本文标题:Django权限系统实现网站的登录与退出功能

      本文链接:https://www.haomeiwen.com/subject/bbbzcktx.html