兩種方式實作使用者登入後網頁跳轉至源位址
常見的網站需要實作登陸後自動跳轉至源位址頁面,在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請求之前的源位址,具體采用哪種方式,可以根據具體的項目要求選擇。