天天看點

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請求中擷取的源位址是自身的位址,代碼執行後,終端會顯示如下:

django架構中 使用者登入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請求之前的源位址,具體采用哪種方式,可以根據具體的項目要求選擇。