用户如果在没有登陆的情况下想访问一个需要登陆的页面
那么先跳转到登陆页面,在地址栏当中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页面,只有登陆的用户才能进来哟~")