两种方式实现用户登录后网页跳转至源地址
常见的网站需要实现登陆后自动跳转至源地址页面,在get请求中,可以通过获取Http中的referer地址实现;而在post请求中则无法直接通过获取的地址进行跳转。下面介绍两种在Django框架中实现post请求跳转源地址网页的方式。
首先看一下get请求中,跳转回源地址的代码段
# 服务器端处理登录请求的函数
def login_views(request):
# get请求下的具体执行代码
if request.method == 'GET':
# django中利用request.META.get('HTTP_REFERER')方法获取来源地址,如果不存在源地址,则取'/'
refurl = request.META.get('HTTP_REFERER','/')
print('refurl1=',refurl)
# 判断session中是否存在uid和uphone
if 'uid' in request.session and 'uphone' in request.session:
return redirect(refurl)
else:
# 判断cookie中是否有uid 和uphone,如有,取出来保存进session
if 'uid' in request.COOKIES and 'uphone' in request.COOKIES:
request.session['uid'] = request.COOKIES.get('uid')
request.session['uphone'] = request.COOKIES.get('uphone')
# if data:
return redirect(refurl)
else:
form = LoginForm()
return render(request,'login.html',locals())
else:
# 处理post请求
pass
post请求中不能直接获取源地址
def login_views(request):
if request.method == 'GET':
pass
else:
# post请求
# 接收uphone和upwd
uphone = request.POST.get('uphone')
upwd = request.POST.get('upwd')
# 获取源地址
refurl = request.META.get('HTTP_REFERER','/')
print('refurl2=',refurl)
..............
return redirect(refurl)
post请求中获取的源地址是自身的地址,代码执行后,终端会显示如下:

此处的post请求提交后获得的源地址refurl是当前的登录地址,在此处会形成死循环,无法跳转目标页面(目标页面是get请求之前的源地址)
解决方案1:创建临时cookie值
未解决上面的问题,可以考虑在get请求中,将源地址临时存入cookie中,在post请求获取cookie中的源地址refurl后,删除cookie中的源地址。代码如下:
def login_views(request):
if request.method == 'GET':
XXXXXXXXXXXXXXXXXXXXXX
else:
# 将refurl保存进cookies,以便post请求取用
# 先构建响应对象,然后将cookies保存进响应对象中
form = LoginForm()
resp = render(request,'login.html',locals())
resp.set_cookie('refurl',refurl)
return resp
post请求中,从cookies中获取源地址refurl
def login_views(request):
if request.method == 'GET':
pass
else:
XXXXXXXXXXXXXXXXXX
if users:
XXXXXXXXXXXXXXXXXXX
# 从cookie中获取refurl
refurl = request.COOKIES.get('refurl','/')
resp = redirect(refurl)
# 删除cookies中的refurl
resp.delete_cookie('refurl')
XXXXXXXXXXXXXXXXXXXX
return resp
else:
# 登录失败,重定向回首页
return redirect('/login/')
解决方案1:将源地址保存为全局变量
除去创建临时cookies的方法,还可以将get请求中获取的源地址保存为全局变量,源地址只能在get请求中修改,但可以在post请求中被引用。代码如下:
get请求代码
def login_views(request):
if request.method == 'GET':
global refurl
refurl = request.META.get('HTTP_REFERER','/')
print('refurl1=',refurl)
XXXXXXXXXXXXXX
else:
pass
post请求代码
def login_views(request):
if request.method == 'GET':
pass
else:
# post请求代码段
XXXXXXXXXXX
# 判断登录是否成功
if users:
XXXXXXXXXXXX
# 判断是否记住密码,如需记住,session存入cookies中
if 'isSaved' in request.POST:
expires = 60*60*24*365
resp.set_cookie('uid', id, expires)
resp.set_cookie('uphone', uphone, expires)
# 源地址refurl为全局变量,可以直接重定向
return redirect(refurl)
else:
# 登录失败,重定向回首页
return redirect('/login/')
两种方法都可以实现在post请求中重定向回到get请求之前的源地址,具体采用哪种方式,可以根据具体的项目要求选择。