Django通过session和装饰器实现登录状态的监控和不同登录权限访问页面控制




1. session使用


session类似于cookie,
session在服务器端,cookie存在于客户端,
session本身是一个键值对,可以向其中注入表示权限的信息,在需要时从中取出信息,从而根据信息判断用户的权限。

首先在你的登录代码中添加session

# 此代码在view.py中
def c_login(request):
    if request.method == 'POST':
        username = request.POST.get('ReID', None)
        password = request.POST.get('Password')
        # print(username, password)
        if Register.objects.filter(ReID=username, Password=password).exists():
            temp = Register.objects.values("Authority").filter(ReID=username, Password=password)

            # 通过session监测登录状态(已经可以用)
            request.session['authority'] = temp[0].get("Authority")

            # 通过cookie监测登录状态,可以设置登录有效时间,暂时无法使用
            response = HttpResponseRedirect('/index/')
            response.set_cookie('username', username, 3600)

            # print(temp[0].get("Authority"))
            if temp[0].get("Authority") == 1:  # 得到并检查权限(注册时设置)
                return redirect('管理员页')
            else:
                return redirect('index')
        else:
            # 返回错误信息,在html中以{{错误}}接收
            return render(request, '登录', {'错误': '用户名或密码错误!'})
    return render(request, '登录')



2. 函数装饰器


函数装饰器是python中一种特殊的函数
通过@function来实现

可以写在一个单独的mydecorator.py文件中
通过import引入,
例如from myapp.mydecorator import login_decorator_1

mydecorator.py文件中函数装饰器代码如下

# 此代码在mydecorator.py中
def login_decorator_1(func):
    def method(request, *args, **kwargs):
        if request.session.has_key("authority") and request.session['authority'] >= 1:
            # 如果登陆了并且权限大于1
            print(request.session['authority'])
            return func(request, *args, **kwargs)  # 运行函数

        else:
            red = HttpResponseRedirect("/index/")  # 重定向到index
            red.set_cookie("url", request.get_full_path())
            return red

    return method



3. 最后在要检测的网页代码前添加此函数装饰器


代码如下:

# 此代码在view.py中
@login_decorator_1
def c_admin(request):
    return render(request, '管理员页')

综上所述,可以实现在django登陆后监控登陆状态,并且根据登录权限控制访问的页面。

posted @ 2021-08-06 12:35  fyhtom  阅读(577)  评论(0)    收藏  举报