django框架中 使用者登入post請求 跳轉源地址的方法
阿新 • • 發佈:2018-11-22
兩種方式實現使用者登入後網頁跳轉至源地址
常見的網站需要實現登陸後自動跳轉至源地址頁面,在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請求之前的源地址,具體採用哪種方式,可以根據具體的專案要求選擇。