装饰器结合cookie

用户如果在没有登陆的情况下想访问一个需要登陆的页面
那么先跳转到登陆页面,在地址栏当中next的后面将会有访问的地址
通过get_full_path获取路径参数,存放在target当中

通过装饰器,获取到next后面的路径,因为没有获取到cookie,那么将会重定向到需要访问的页面,地址栏当中(next后)携带着访问的地址,传递给login页面,提交POST请求
当用户输入正确的用户名和密码之后,会对页面添加一个cookie,当跳转到装饰器当中
发现获取到了cookie,所以不会重定向到登录界面,直接访问到页面

应该跳转到用户之前想要访问的页面去 而不是直接写死
#装饰器
def login_auth(func):
    def inner(request,*args,**kwargs):
        # print(request.path_info)
        # print(request.get_full_path())  # 能够获取到用户上一次想要访问的url
        target_url = request.get_full_path()
        if request.COOKIES.get('username'): # 获取到cookie当中的内容
            return func(request,*args,**kwargs)
        else:
            return redirect('/login/?next=%s'%target_url)
    return inner
# 登录函数,主要是用来验证POST请求
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'jason' and password == '123':
            # 获取用户上一次想要访问的url
            target_url = request.GET.get('next')  # 这个结果可能是None
            if target_url:
                # 通过一个函数保存数据对象,如果有值将重定向到target_url页面
                obj = redirect(target_url)
            else:
                # 保存用户登陆状态
                obj = redirect('/home/')
            # 让浏览器记录cookie数据
            obj.set_cookie('username', 'jason666')
            """
            浏览器不单单会帮你存
            而且后面每次访问你的时候还会带着它过来
            """
            # 跳转到一个需要用户登陆之后才能看的页面
            # 这里是相当于用户先用obj接收,接收完成后再返回出去,
            # 这里相当于是return redirect(target_url)
            return obj
    return render(request,'login.html')
# 需要访问的页面
@login_auth
def home(request):
    return HttpResponse("我是home页面,只有登陆的用户才能进来哟~")
原文地址:https://www.cnblogs.com/Ailewent/p/14260236.html