1. 程式人生 > >django框架中 使用者登入post請求 跳轉源地址的方法

django框架中 使用者登入post請求 跳轉源地址的方法

兩種方式實現使用者登入後網頁跳轉至源地址

常見的網站需要實現登陸後自動跳轉至源地址頁面,在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請求之前的源地址,具體採用哪種方式,可以根據具體的專案要求選擇。